1.AccessibleObject
Method、Field和Constructor类都继承了AccessibleObject类,它提供了标记反射对象的能力,以抑制在使用时使用默认Java语言访问控制检查,从而能够任意调用被私有化保护的方法、域和构造函数;
/**
*AccessibleObject是Method、Field、Constructor类的基类,它提供了将反射的对象标记为在使用的时候取消默认Java语言
*访问控制检查力,对于公共成员、默认成员、私有成员、受保护成员;在分别使用Field、Method、Constructor对象来设置或获取字段、
*调用方法、 或者创建初
*始化对象的时候,执行安全检查。
**/
public class AccessibleObject implements AnnotatedElement
2.setAccessible访问方法
- 将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射*的对象应该实施 Java 语言访问检查。
- 首先,如果存在安全管理器,则在 ReflectPermission(“suppressAccessChecks”) 权限下调用 checkPermission 方法
- 如果 flag 为 true,并且不能更改此对象的可访问性(例如,如果此元素对象是 Class 类的 Constructor 对象),则会引发 SecurityException。
- 如果此对象是 java.lang.Class 类的 Constructor 对象,并且 flag 为 true,则会引发 SecurityException。
- 参数:flag - accessible 标志的新值
- 抛出:SecurityException - 如果请求被拒绝
public void setAccessible(boolean flag)
throws SecurityException
- 使用单一安全性检查(为了提高效率)为一组对象设置 accessible 标志的便捷方法。
- 首先,如果存在安全管理器,则在 ReflectPermission(“suppressAccessChecks”) 权限下调用 checkPermission 方法。
- 如果 flag 为 true,但是不能更改输入 array 的任何元素的可访问性(例如,如果元素对象是 Class 类的 Constructor 对象),则会引发 SecurityException。如果发生 SecurityException,对于少于(不包括)发生异常的元素的数组元素,可以将对象的可访问性设置为 flag;对于超出(包括)引发异常的元素的那些元素,则不更改其可访问性。
- 参数:
array - AccessibleObjects 的数组
flag - 每个对象中的 accessible 标志的新值
抛出:
SecurityException - 如果请求被拒绝。
public static void setAccessible(AccessibleObject[] array, boolean flag)
3.示例代码如下
- 声明一个Work类
package com.test.Application;
public class Work {
private String name;
private int age;
public Work() {
}
public Work(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String workDetails(String name, int age) {
return name+"--"+age;
}
}
- 测试示例客户端类
package com.test.Application;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Method;
public class AccessiableTest {
public static void main(String[] args) throws Exception {
Work work = new Work("tina", 18);
//获取class对象
Class<?> clazz = work.getClass();
//获取当前对象中声明的方法
Method method = clazz.getDeclaredMethod("workDetails", new Class[]{String.class, int.class});
//设置所有的成员都可以访问
method.setAccessible(true);
//获取类声明的所有方法
Method[] methods = clazz.getDeclaredMethods();
//批量设置类的所有方法d都可以被访问
AccessibleObject.setAccessible(methods, true);
}
}