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构造。
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("----非静态的参数初始化---"); } }
相关文章推荐
- 以字节流读取文件时中文乱码解决
- Java_IO_Scanner类
- spring中配置quartz定时器
- java中对于页面传入ids的数组进行的批量操作
- Eclipse juno 中安装 JBoss Tools,集成Hibernate
- eclipse 常用快捷键
- Spring相关名词(0)
- javaMail邮件发送
- 学习《spring 3.x企业应用开发实战》之Spring对DAO的支持
- java实现顺序栈
- [Spring]Spring Bean的初始化 ---- getBean方法
- java.lang.IllegalArgumentException
- java爬虫爬取网页内容前,对网页内容的编码格式进行判断的方式
- RxJava 详解
- Java 多线程:Lock接口(接口方法分析,ReentrantLock,ReadWriteLock 3ff8
- 线程池的理解
- Java_IO_File
- Android 4.4Eclipse项目中使用RecyclerView
- java web使用Cookie进行会话管理
- (2)Spring框架