Java 反射机制 父类私有字段处理

1.获取class的方法

object.getClass() 获取这个实例所属的class对象
type.class 通过类型获取所属class对象
Class.forName() 通过类路径获取class对象
Double.TYPE 对应基本类型double.class,所有基本类型均可通过其包装类型的TYPE获取

Class.getSuperclass() 获取父类的class对象
Class.getClasses() 获取类内所有的公开的类,接口,枚举成员,以及它继承的成员(特指类)
Class.getDeclaredClasses() 通过类内显示声明的类,借口
Class.getEnclosingClass()

获取闭包类

public class MyClass {
    static Object o = new Object() { 
        public void m() {} 
    };
    static Class = o.getClass().getEnclosingClass();//MyClass
}


2.获取成员

getDeclaredField(String name) 获取指定字段(公有,私有),不包括父类字段
getField(String name) 获取指定字段(公有),包括父类字段
getDelaredFields() 获取所有类内显示声明的字段(公有,私有),不包括父类字段
getFields() 获取所有字段(公有),包括父类字段
getDeclaredMethod(String name, Class .. paramType) 获取指定方法(公有,私有),不包括父类方法
getMethod(String name, Class .. paramType) 获取指定方法(公有),包括父类方法
getDeclaredMethods() 获取所有声明方法(公有,私有),不包括父类方法
getMethods() 获取所有方法(公有),包括父类方法

3.问题:获取父类一个私有字段值,并且重新赋值

突破点,父类私有字段的get,set方法一般均为公有,从方法入手。

 PropertyDescriptor pd = new PropertyDescriptor(fieldName, object.getClass());
 Method getMethod = pd.getReadMethod();
 Method setMethod = pd.getWriteMethod();
 Class type = getMethod.getPropertyType();//可根据判断类型另作处理
 T field = getMethod.invoke();
 T fieldNew = value;
 setMethod.invoke(object,fieldNew);

注意:私有域调用之前必须执行,field.setAccessible(true) 或者 method.setAccessible(true)

官方API文档


你可能感兴趣的:(Java 反射机制 父类私有字段处理)