您的位置:首页 > 编程语言 > Java开发

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

2016-07-21 18:48 567 查看
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.TestClassType

Class testTypeForName=Class.forName("com.powernode.test.TestClassType");
System.out.println("testTypeForName---"+testTypeForName);
//输出
//---静态的参数初始化---
//testTypeForName---class com.powernode.test.TestClassType

TestClassType 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("----非静态的参数初始化---");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: