Java 反射 调用私有域和方法(setAccessible)
Java 反射 调用私有域和方法(setAccessible)
@author ixenos
AccessibleObject类
Method、Field和Constructor类共同继承了AccessibleObject类,该基类有两个setAccessible方法能在运行时压制Java语言访问控制检查(Java language access control checks),从而能任意调用被私有化保护的方法、域和构造方法
public class AccessibleObjectextends Objectimplements AnnotatedElementAccessibleObject 类是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获取字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。
在反射对象中设置 accessible 标志允许具有足够特权的复杂应用程序(比如 Java Object Serialization 或其他持久性机制)以某种通常禁止使用的方式来操作对象。
两个setAccessible方法设置访问权限
static void |
setAccessible(AccessibleObject[] array, boolean flag) 使用单一安全性检查(为了提高效率)为一组对象设置 accessible 标志的便捷方法。 |
void |
setAccessible(boolean flag)将此对象的 accessible 标志设置为指示的布尔值。 |
setAccessible
public static void setAccessible(AccessibleObject[] array,
boolean flag)
throws SecurityException
- 使用单一安全性检查(为了提高效率)为一组对象设置 accessible 标志的便捷方法。
首先,如果存在安全管理器,则在
ReflectPermission("suppressAccessChecks")权限下调用checkPermission方法。如果
flag为true,但是不能更改输入array的任何元素的可访问性(例如,如果元素对象是Class类的Constructor对象),则会引发SecurityException。如果发生 SecurityException,对于少于(不包括)发生异常的元素的数组元素,可以将对象的可访问性设置为flag;对于超出(包括)引发异常的元素的那些元素,则不更改其可访问性。
- 参数:
array- AccessibleObjects 的数组flag- 每个对象中的 accessible 标志的新值- 抛出:
SecurityException- 如果请求被拒绝。- 另请参见:
SecurityManager.checkPermission(java.security.Permission),RuntimePermission
setAccessible
public void setAccessible(boolean flag)
throws SecurityException
- 将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
首先,如果存在安全管理器,则在
ReflectPermission("suppressAccessChecks")权限下调用checkPermission方法。如果
flag为true,并且不能更改此对象的可访问性(例如,如果此元素对象是Class类的Constructor对象),则会引发SecurityException。如果此对象是
java.lang.Class类的Constructor对象,并且flag为 true,则会引发SecurityException。
- 参数:
flag- accessible 标志的新值- 抛出:
SecurityException- 如果请求被拒绝。- 另请参见:
SecurityManager.checkPermission(java.security.Permission),RuntimePermission
示例
被测类:
1 class Employee{
2 private int id;
3 private String name;
4 private int age;
5
6 public Employee(){
7
8 }
9 public Employee(int id, String name, int age){
10 this.id = id;
11 this.name = name;
12 this.age = age;
13 }
14
15 private void setId(int id){
16 this.id = id;
17 }
18 private int judge(int id){
19 return this.id - id;
20 }
21 private String sayHalo(String name){
22 return "Halo" + name;
23 }
24 }
Employee
测试类:
public class PrivateTest{
public static void main(String[] args){
Employee em = new Employee(1, "Alex", 22);
//获取Class对象
Class<?> emClass = em.getClass();
//获取特定的声明了的方法
Method judgeMethod = emClass.getDeclaredMethod("judge", new Class[]{Integer.TYPE});
//setAccessible(boolean flag)使所有成员可以访问,访问之前设置
judgeMethod.setAccessible(true);
//获取所有声明的方法
Method[] allMethods = emClass.getDeclaredMethods();
//AccessibleObject.setAccessible(AccessibleObject[] array,
boolean flag)批量给访问权限
AccessibleObject.setAccessible(allMethods, true);
//下面就可以通过反射访问了
judgeMethod.invoke(em, new Object[]{3});
//or...
for(Method method : allMethods){
...
}
}
}
Java 反射 调用私有域和方法(setAccessible)的更多相关文章
- java反射调用某个对象的方法
// 反射调用某个对象的方法 public Object invokeMethod(Object methodObject, String methodName, Object[] args) thr ...
- java反射调用私有方法和修改私有属性
//调用私有方法package com.java.test; public class PrivateMethod { private String sayHello(String name) { r ...
- Java 反射 调用私有构造方法
单例类: package singleton; public class SingletonTest { // 私有构造方法 private SingletonTest(){ System.out.p ...
- 利用java反射调用类的的私有方法--转
原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
- C# 反射调用私有事件
原文:C# 反射调用私有事件 在 C# 反射调用私有事件经常会不知道如何写,本文告诉大家如何调用 假设有 A 类的代码定义了一个私有的事件 class A { private event EventH ...
- 2019-11-29-C#-反射调用私有事件
原文:2019-11-29-C#-反射调用私有事件 title author date CreateTime categories C# 反射调用私有事件 lindexi 2019-11-29 08: ...
- Java反射理解(五)-- 方法反射的基本操作
Java反射理解(五)-- 方法反射的基本操作 方法的反射 1. 如何获取某个方法 方法的名称和方法的参数列表才能唯一决定某个方法 2. 方法反射的操作 method.invoke(对象,参数列表) ...
- 2019-4-16-C#-使用反射获取私有属性的方法
title author date CreateTime categories C# 使用反射获取私有属性的方法 lindexi 2019-4-16 10:13:3 +0800 2018-09-26 ...
- 2019-8-30-C#-反射调用私有事件
title author date CreateTime categories C# 反射调用私有事件 lindexi 2019-08-30 08:52:57 +0800 2018-09-19 20: ...
随机推荐
- 【USACO】接住苹果
接住苹果奶牛喜欢吃苹果.约翰有两棵苹果树,有 N 只苹果会从树上陆续落下.如果掉苹果的时候,贝西在那棵树下,她就能接住苹果.贝西一开始在第一棵树下.在苹果掉落之前,她有足够的时间来回走动,但她很懒,最 ...
- linux 查看磁盘占用情况
查看"/usr/local/"路径下,所有文件大小总和.只列出总和,不显示该路径下各子文件的大小. du -sh /usr/local/ 结果显示如下图: 如果要详细显示出各子文件 ...
- jq屏蔽f5
//屏蔽F5 $(document).ready(function () { $(document).bind("keydown", function (e) { e = wind ...
- lua调用C语言
在上一篇文章(C调用lua函数)中,讲述了如何用c语言调用lua函数,通常,A语言能调用B语言,反过来也是成立的.正如Java 与c语言之间使用JNI来互调,Lua与C也可以互调. 当lua调用c ...
- SAP HANA 中的决策表(Decision Table)
http://scn.sap.com/community/developer-center/hana/blog/2013/01/11/what-can-you-do-with-decision-tab ...
- 中文版的jqGrid实例大全
中文版的jqGrid实例大全 http://blog.mn886.net/jqGrid/
- ajax客户端请求与服务端响应浅谈
AJAX,即Asynchronous Javascript And XML,AJAX本质是在HTTP协议的基础上以异步的方式与服务器进行通信. 所谓的异步,是指某段程序执行不会阻塞其他程序执行,其表现 ...
- DOM小解
现在来说说DOM 文档对象模型DOM(Document Object Model)定义访问和处理html文档的标准方法.DOM将html文档呈现为带有元素 ,属性和文本的树结构(节点树) 先来看看 ...
- JUnit——(二)注解
1. 两种错误:Error和Failure Error是代码错误 @Test publicvoid testAdd() { int z=new T().add(5,3); assertEquals(8 ...
- 《C++反汇编与逆向分析技术揭秘》——流程控制语句的识别
if...else...语句 示例: if构成多分支语句 switch 有序线性的switch: 3E82D8位置存放了一个表,标明了要跳转到的地址: 这里的每四字节都标明的是每个case块的首地址: ...