JAVA反射机制可以从Class反射对象中获取构造函数,成员变量,方法类等类元素的反射对象,绕开语言访问检查可访问private的变量,同时可以在程序运行时对对象进行修改。反射技术是框架的核心基础技术之一。
package com.song.reflect;
public class PrivateCar {
public PrivateCar(String color){
this.color = color;
System.out.println("调用了我的构造器,将color设置为:"+color);
}
private String color;
protected void drive(){
System.out.println("drive private car! the color is "+color);
}
}
package com.song.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class PrivateCarReflect {
public static void main(String[] args) throws Exception {
//得到类加载器
ClassLoader loader = Thread.currentThread().getContextClassLoader();
//通过全额限定名得到类反射的实例
Class clazz = loader.loadClass("com.song.reflect.PrivateCar");
//得到构造器
Constructor cons = clazz.getDeclaredConstructor(String.class);
//通过构造器实例化pcar
PrivateCar pcar = (PrivateCar)cons.newInstance("黑色");
//通过反射的实例得到要访问的private变量
//Field colorFld = clazz.getField("color"); 不能使用该方法
Field colorFld = clazz.getDeclaredField("color");
//更改访问属性
colorFld.setAccessible(true);
colorFld.set(pcar, "红色");
//通过反射的实例得到要访问的private方法
Method driveMtd = clazz.getDeclaredMethod("drive", null);
driveMtd.setAccessible(true);
//执行,第一个参数为要执行该方法的对象名,第二个参数为参数列表
driveMtd.invoke(pcar, null);
}
}
Constructor :类的构造函数反射。通过Class.getConstructors()可以获得类的所有构造函数反射对象数组。还可以通过getConstructor(Class...parameterTypes)获取拥有特定入参的构造函数反射对象。通过newInstance(Object...initargs)创建一个对象的实例。
Method:类方法的反射类,通过Class.getDeclaredMethods()方法可以获取类的所有方法反射类对象数组
Method[],还可以通过getDeclaredMethod(String name,Class...parameterTypes)获取特定签名的方法,name为方法名,Class...为入参列表。 getReturnType()获取返回值类型, getParameterTypes()获取方法的入参类型数组, getExceptionType()获取方法的异常类型, getParameterAnnotations()获取方法的注释信息。
Field:类的成员变量的反射类。通过Class.getDeclareeFields()方法获取类成员变量反射对象数组,通过getDeclareField(String name)获取特定名称的成员变量反射对象。最主要方法有set(Object obj,Object value),obj为操作的目标对象,value为设定的值。还有类似setInt(Object obj,int value)这样带类型的设置方法。