Java反射机制
相关类型: java.lang.Class java.lang.reflect.Constructor java.lang.reflect.Field java.lang.reflect.Method java.lang.reflect.Modifier 作用: 1、反编译 .class –> .java 2、通过反射机制访问java对象的属性、方法、构造方法等。这个在android中经常用到。 获取Class类型对象的三种方式: 1、Class.forName(className) 它就是将className加载到JVM的过程,得到堆中加载的class字节码的引用,类中的静态块会被执行,className必须为全名:包名+类名 这里写图片描述 2、类名.class java每个类型都有class属性,类中的静态块不会被执行 3、实例对象.getClass() 得到实例对象的运行时类,类中的静态块会被执行 下面来对上面的说法进行验证:下面来对上面的说法进行验证: public class CustomClass { static { System.out.println("executed static block"); } public CustomClass() { System.out.println("executed CustomClass constructor"); } } public class ReflectTest { public static void main(String[] args) throws Exception{ //第一种方式:Class.forName System.out.println("Class.forName==========="); //Class c1 = Class.forName("CustomClass"); } } 输出结果: Class.forName=========== executed static block 可以看到CustomClass的静态块被执行,说明在执行Class.forName会触发CustomClass类的加载。 public class ReflectTest { public static void main(String[] args) throws Exception{ //第二种方式:类名.class System.out.println("类名.class=============="); Class c2 = CustomClass.class; } } 输出结果: 类名.class============== 可以看到CustomClass的静态块没有执行,说明CustomClass.class没有触发CustomClass类的加载。 public class ReflectTest { public static void main(String[] args) throws Exception{ //第三种方式:实例对象.getClass() System.out.println("实例对象.getClass()========="); CustomClass customClass = new CustomClass(); Class c3 = customClass.getClass(); } } 输出结果: 实例对象.getClass()========= executed static block executed CustomClass constructor 这个比较好理解,在创建对象的时候就会触发CustomClass类的加载,然后创建对象,执行构造函数。 得到这个Class之后,我们就可以进行一些列的操作了。
http://developer.android.com/reference/java/lang/Class.html