该反射是要以泛型编程知识为基础的
反射原理:是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展。
引入包
import java.lang.reflect.Field; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.AccessibleObject;
获取class类的对象
// 通过类的class方法
Consumer.class
// 通过对象的getClass方法,该方法是Object类的方法
Consumer c = new Consumer();
c.getClass()
// 使用Class类中的forName(String className)
Class> c = Class.forName("cn.lh.Consumer");
其中反射用的方法是第二种方法
反射获取构造方法
public static void getProperty() throws ClassNotFoundException, NoSuchMethodException {
Class> c = Class.forName("cn.lh.Consumer");
Constructor>[] cs = c.getConstructors();
for (Constructor> cr: cs) {
System.out.println(cr);
}
}
相关API
public Constructor>[] getDeclaredConstructors() public ConstructorgetDeclaredConstructor(Class>... parameterTypes) public Constructor>[] getConstructors() public Constructor getConstructor(Class>... parameterTypes)
构造器和上面的方法、属性都是大同小异的。需要注意的是,当返回一个数组的时候,返回类型是Constructor>[]而不是Constructor
其他同理
反射获取所有方法
public Method[] getDeclaredMethods()
public Method getDeclaredMethod(String name,
Class>... parameterTypes)
public Method[] getMethods()
public Method getMethod(String name,
Class>... parameterTypes)
获取成员变量信息
public Field getField(String name) public Field[] getFields() public Field[] getDeclaredFields()
总结:反射其实就是在程序运行期创建对象的方法,也成为动态创建对象,与此相对的是new的静态创建对象,new是在编译期间创建对象的,增加了.class文件的体积,把一些事情给计算机做岂不是更好?
参考:
- Java反射机制详解



