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("----非静态的参数初始化---");} }
- Java反射:类名.class、class.forName()、对象.getClass区别 详解
- java中Class对象详解和类名.class, class.forName(), getClass()区别
- java中Class对象详解和类名.class, class.forName(), getClass()区别
- java中Class对象详解和类名.class, class.forName(), getClass()区别
- Java中Class对象详解、类名.class、class.forName()、 getClass()区别
- java中Class对象详解和类名.class, class.forName(), getClass()区别
- java中Class对象详解、类名.class, class.forName(), getClass()区别
- java中Class对象详解和类名.class, class.forName(), getClass()区别
- java中Class对象详解和类名.class, class.forName(), getClass()区别
- java中Class对象详解和类名.class, class.forName(), getClass()区别
- java中Class对象详解和类名.class, class.forName(), getClass()区别
- java反射(1) 之class.forName(""), 类名.class, 对象.getClass()区别
- 类名.class, class.forName(), getClass()区别
- 类名.class, class.forName(), getClass()区别
- 类名.class, class.forName(), getClass()区别
- 类名.class, class.forName(), getClass()区别
- 类名.class, class.forName(), getClass()区别
- 类名.class, class.forName(), getClass()区别
- IOS中延时执行的几种方式的比较和汇总
- log4的使用及诠释
- Android项目里集成Cordova详解
- android byte字节数组转换十六进制字符串
- CodeForces 612B HDD is Outdated Technology
- Java反射:类名.class、class.forName()、对象.getClass区别 详解
- Fragment和Activity生命周期以及横竖屏切换对生命周期的影响
- 故障案例--binlog_format不为row模式下关于时区设置的一个坑
- java爬虫
- iOS 客户端的本地缓存处理
- 阻塞与非阻塞,同步与异步
- Android Picasso的基本使用
- 检测字符串包含字符串
- 史上最全的贝塞尔曲线(Bezier)全解(三):贝塞尔曲线实现满屏爱心