Java反射调用私有域和方法(AccessibleObject可访问性控制)

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);
    }
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值