Java反射机制总结(引自他人)
Java反射机制概念:
Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
关于Class(java.lang.Class):
Java有个Object类,是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class对象。
Class类十分特殊。它和一般类一样继承自Object,其实体用以表达Java程序运行时的classes和interfaces,也用来表达enum、array、primitive Java types(boolean, byte, char, short, int, long, float, double)以及关键词void。当一个class被加载,或当类加载器(class loader)的defineClass()被JVM调用,JVM便自动产生一个Class对象。
Class是反射(Reflection)故事的起源。针对任何您想探勘的类,唯有先为它产生一个Class对象,接下来才能经由后者唤起为数十多个的Reflection APIs。Reflection机制允许程序在正在执行的过程中,利用Reflection APIs取得任何已知名称的类的内部信息,包括:package、type parameters、superclass、implemented interfaces、inner classes、outer classes、fields、constructors、methods、modifiers等,并可以在执行的过程中,动态生成instances、变更fields内容或唤起methods。
1、Class是一个类,一个描述类的类(也就是描述类本身),封装了描述方法的Method,描述字段的Filed,描述构造器的Constructor等属性
2、对象照镜子后(反射)可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。
3、对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
4、Class 对象只能由系统建立对象。
5、一个类在 JVM 中只会有一个Class实例。
反射机制获取类的三种方式:
public class Person { private String name; /** * 该类如果要能通过反射创建实例,必须要有显示的无参构造方法 */ public Person() { } public Person(String name) { this.name = name; } public void showEffect() { System.out.println("这种装扮的" + name); } }
/** * 反射机制获取类的三种方式 */ @Test public void testGetClass() throws ClassNotFoundException { Class clazz = null; //1 直接通过类名.Class的方式得到 clazz = Person.class; System.out.println("通过类名: " + clazz); //2 通过对象的getClass()方法获取,这个使用的少(一般是传的是Object,不知道是什么类型的时候才用) Object obj = new Person(); clazz = obj.getClass(); System.out.println("通过getClass(): " + clazz); //3 通过全类名获取,用的比较多,但可能抛出ClassNotFoundException异常 clazz = Class.forName("com.java.reflection.Person"); System.out.println("通过全类名获取: " + clazz); }
利用newInstance创建对象:
注意:一个类要能通过反射创建实例,它必须有显示的无参构造方法,这是一个硬性要求。
/** * Class类的newInstance()方法,创建类的一个对象。 */ @Test public void testNewInstance() throws ClassNotFoundException, IllegalAccessException, InstantiationException { Class clazz = Class.forName("com.java.reflection.Person"); //使用Class类的newInstance()方法创建类的一个对象 //实际调用的类的那个 无参数的构造器(这就是为什么写的类的时候,要写一个无参数的构造器,就是给反射用的) //一般的,一个类若声明了带参数的构造器,也要声明一个无参数的构造器 Object obj = clazz.newInstance(); System.out.println(obj); }