Java反射:类名.class、class.forName()、对象.getClass区别 详解

来源:互联网 发布:算法和伪代码 编辑:程序博客网 时间:2024/06/03 19:21

1.Class a=A.class; 说明:JVM将使用类A的类装载器,将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作.返回类A的class的对象

Java编程思想P319,建议使用“.class”的形式,以保持与普通类的一致性;当使用“.class”来创建对class对象的引用时,不会自动地初始化该class对象,初始化被延迟到了对静态方法(构造器隐式地是静态的)或者非常数静态域进行首次引用时才执行。

2.class.forName("类名字符串")  (注:类名字符串是包名+类名)  说明:装入类,并做类的静态初始化,返回class的对象

3.实例对象.getClass()  说明:对类进行静态初始化、非静态初始化;返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象


从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用Class对象的newInstance()方法的时候,就必须保证:1、这个 类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。   现在可以看出,Class对象的newInstance()(这种用法和Java中的工厂模式有着异曲同工之妙)实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。

最后用最简单的描述来区分new关键字和newInstance()方法的区别: 

newInstance: 弱类型。低效率。只能调用无参构造。 

new: 强类型。相对高效。能调用任何public构造。

public class TestClass {public  static void main(String[] args){try {Class testTypeClass=TestClassType.class;System.out.println("testTypeClass---"+testTypeClass);//输出     //testTypeClass---class com.powernode.test.TestClassTypeClass testTypeForName=Class.forName("com.powernode.test.TestClassType");        System.out.println("testTypeForName---"+testTypeForName);//输出   //---静态的参数初始化---//testTypeForName---class com.powernode.test.TestClassTypeTestClassType testTypeGetClass= new TestClassType();System.out.println("testTypeGetClass---"+testTypeGetClass.getClass());//输出//---静态的参数初始化---//----非静态的参数初始化---//----构造函数---//testTypeGetClass---class com.powernode.test.TestClassType} catch (ClassNotFoundException e) {  e.printStackTrace();}}}class TestClassType{//构造函数public TestClassType(){System.out.println("----构造函数---");}//静态的参数初始化static{System.out.println("---静态的参数初始化---");}//非静态的参数初始化{System.out.println("----非静态的参数初始化---");}        }



1 0
原创粉丝点击