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: ...
随机推荐
- phpopp
<?php header("content-type:text/html;charset=utf8"); class lidepeng{ var $name; public ...
- es5 数组
一. 数组申明 var a = new Array(5) 会生成一个长度为5 每个元素都是undifined的数组 var a = new Array(1,2,3) 跟 var a = [1,2,3 ...
- Python 的基本使用说明
1.先定义一个被调用的模块,文件名 cnf.py #!/usr/bin/ #coding=utf- import sys reload(sys) sys.setdefaultencoding( &qu ...
- python爬虫框架scrapy初试(二)
将该导航网站搜索出结果的页面http://www.dmoz.org/Computers/Programming/Languages/Python/Books/里面标题,及标题的超链接和描述爬下来. 使 ...
- 第12章 MySQL高级管理
1.手动更新权限后,需向服务器指出已对权限进行修改: (在MySQL提示符下)flush privileges; 2.查看用户所拥有的权限: 如: show grants for bookorama; ...
- C# Where
判断一个字符串中是否包含字符串数组里的字符,恶意字符限制提交,一般人,包括最初的我,会这样写 public bool ValidateStr(string[] parms) { bool result ...
- CentOS 6.5 部署Unison双向同步服务
环境介绍: 服务器 IP Server1 192.168.30.131 Server2 192.168.30.132 1.添加主机互信: a.添加host文件(在Server1.Serve ...
- top batch output
echo 3 > sudo tee /proc/sys/vm/drop_caches top -d30 -bn20 > a
- 【JS】倒计时
描述: 先要链接jquery.js,这样写法可以直接放JS文件运行. //放在图片里定位的倒计时 //顶图里面定位才使用的代码 document.writeln("<style> ...
- 解决IE兼容总汇【转】
转载声明: 藏羚羊 2014年04月16日 于 前端开拓者 发表 本文固定链接: http://www.frontopen.com/2552.html 1. <meta http-equiv=“ ...