java反射(1) 之class.forName(""), 类名.class, 对象.getClass()区别
来源:互联网 发布:赛亚人网络 编辑:程序博客网 时间:2024/06/07 19:17
1、先说class.forName("")
先看API
public static Class<?> forName(String className)
throws ClassNotFoundException返回与带有给定字符串名的类或接口相关联的 Class 对象。调用此方法等效于:
Class.forName(className, true, currentLoader)(此来源Class的另一个方法
public static Class<?> forName(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException)
其中 currentLoader 表示当前类的定义类加载器。
例如,以下代码片段返回命名为 java.lang.Thread 的类的运行时 Class 描述符。
Class t = Class.forName("java.lang.Thread")
调用 forName("X") 将导致命名为 X 的类被初始化。
true表示用加载器加载这个类生成Class对象的同时,并且初始化这个类。
package com.testclass;public class TestClass {public static void main(String[] args) {try {Class c = Class.forName("com.testclass.Test");System.out.println(c.getName());} catch (ClassNotFoundException e) {e.printStackTrace();}}}class Test {static {System.out.println("执行静态块,初始化类");}public Test() {System.out.println("构造方法执行");}}
输出:
执行静态块,初始化类
com.testclass.Test
说明当使用Class.forName("")进行反射生成Class对象的时候,执行了这个类的静态代码,初始化了这个类
补充:Class.forName(xxx.xx.xx) 返回的是一个类, .newInstance() 后才创建一个对象 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段 (来源http://blog.csdn.net/ozwarld/article/details/8277361)
2、类名.class
JVM将使用类A的类装载器,将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作.返回类A的Class的对象
package com.testclass;public class TestClass {public static void main(String[] args) {Class c = Test.class;System.out.println(c.getName());}}class Test {static {System.out.println("执行静态块,初始化类");}public Test() { System.out.println("构造方法执行"); }}输出:
com.testclass.Test
也就是说利用类名.class进行反射生成Class对象的时候,不会初始化这个类,更不会执行这个类的静态代码
3、对象.getClass()
Class cl=对象引用.getClass();返回引用o运行时真正所指的对象所属的类的Class对象(因为:儿子对象的引用可能会赋给父对象的引用变量中,也就是上转型对象)
就是现有对象然后再通过这个对象用Class cl=对象引用.getClass()得到Class对象
但是在静态方法中不能用this.getClass()得到这个类的Class对象。原因当然是静态方法中不能用this的原因了
- java反射(1) 之class.forName(""), 类名.class, 对象.getClass()区别
- 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()区别
- 类名.class, class.forName(), getClass()区别
- 类名.class, class.forName(), getClass()区别
- 类名.class, class.forName(), getClass()区别
- 类名.class, class.forName(), getClass()区别
- 类名.class, class.forName(), getClass()区别
- 类名.class, class.forName(), getClass()区别
- Android OTA 升级之二:脚本 ota_from_target_files
- POJ 1112 Team Them Up!
- 页面请求中没有referrer信息的几种情况
- 关于cocostudio中demogame样例中ccmenu的位置的疑问分析
- Qt 如何把版本信息加入应用程序
- java反射(1) 之class.forName(""), 类名.class, 对象.getClass()区别
- AS3 缓动加速动画
- HTTP_REFERER
- 理解MySQL——索引与优化
- Android 开机启动服务
- iOS设备列表
- iis5.1 出现登录框最新办法
- IT职业发展路线图
- 编程练习(1)