`
zizihaier
  • 浏览: 55464 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

反射来更改访问权限

阅读更多
通过反射来更改访问权限 

2007-09-14 21:47:11|  分类: 默认分类 |字号 订阅

利用反射中的AccessibleObject我们可以更改,方法或属性的访问权限。

该类是Constructor, Field, Method的超类。

public class AccessibleObject extends Object implements AnnotatedElement

AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获取字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。

在反射对象中设置 accessible 标志允许具有足够特权的复杂应用程序(比如 Java Object Serialization 或其他持久性机制)以某种通常禁止使用的方式来操作对象。

public final class ReflectPermission  extends BasicPermission

反射操作的 Permission 类。ReflectPermission 是一种指定权限,没有动作。当前定义的唯一名称是 suppressAccessChecks,它允许取消由反射对象在其使用点上执行的标准 Java 语言访问检查 - 对于 public、default(包)访问、protected、private 成员。

Method对象中的invoke方法:

public Object invoke(Object obj, Object... args)

              throws IllegalAccessException,

                     IllegalArgumentException,

                     InvocationTargetException

对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。

如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。

如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。

如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。

如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。

如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。

参数:

obj - 从中调用底层方法的对象

args - 用于方法调用的参数

返回:

使用参数 args 在 obj 上指派该对象所表示方法的结果

抛出:

IllegalAccessException - 如果此 Method 对象强制执行 Java 语言访问控制,并且底层方法是不可访问的。

IllegalArgumentException - 如果该方法是实例方法,且指定对象参数不是声明底层方法的类或接口(或其中的子类或实现程序)的实例;如果实参和形参的数量不相同;如果基本参数的解包转换失败;如果在解包后,无法通过方法调用转换将参数值转换为相应的形参类型。

InvocationTargetException - 如果底层方法抛出异常。

NullPointerException - 如果指定对象为 null,且该方法是一个实例方法。

ExceptionInInitializerError - 如果由此方法引起的初始化失败。

ClassName a = new ClassName();

Class c = ClassName.class;

Method method = c.getDeclaredMethod();

method.setAccessible(true);

method.invoke(a, method的参数);

Field field = c.getDeclaredField();

field.setAccessible(trur);

field.setInt(a,要设置的field的值);
分享到:
评论

相关推荐

    JAVA新特性--java反射、映射

    反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp...

    Thinkphp3.2.3通用后台+API接口设计

    1.此项目是基于Thinkphp3.2.3+easyui做的权限管理系统,所有后台管理系统均可基于此...3.数据库文件放于public目录下面,导入自己数据库修改common目录下的config数据库配置即可正常访问。 4.此项目纯属学习交流用途。

    rfm2g_common.pdf

    反射内存网络是一种特殊类型的共享内存系统,旨在使多个独立计算机共享通用数据集。反射内存网络可在每个子系统中保存整个...每个子系统均享有充分且不受限制的访问权限,还能以极高的本地内存写入速度修改本地数据集。

    gnssrefl:GNSS反射规范

    gnssrefl 目录 消息 2021年3月17日 我已经从默认的RINEX 2.11存档搜索列表中删除了CDDIS。 如果使用-archive cddis... 由于CDDIS实施了安全限制,因此我们不得不更改下载访问权限。 由于这个原因,我们强烈建议您在计算

    ASP.NET图书馆B/S系统

    系统基础代码应用了PetShop系统设计中的反射机制和抽象工厂方法模式,生成的基础类库包括Model对象实体类,封装操作数据库的类和函数的程序集DBUtility,数据访问层的接口程序集IDAL,访问SQL Server数据库,实现...

    投票系统

    Common项目是一个数据访问层,提供自动生成插入和修改的SQL语句的功能。 DbOperation.cs: 数据库访问类,支持事务。 SqlGenerator.cs: SQL语句生成类,使用了c#的反射功能。 Vote项目是表示层,同时在业务...

    windowsnt 技术内幕

    理解特殊访问权限 NTFS文件和文件夹的拷贝和移动 删除具有“禁止访问”权限的文件 为什么修改权限不能马上起作用 理解微软公司的打印术语 理解NT打印权限 设置打印机权限 创建一个新打印机 共享一个已经存在的打印机...

    Purr:满足您对每秒原始帧的渴望

    我们使用Android SDK反射来访问隐藏的API,以更改手机屏幕的分辨率。 我们需要的是可以使用ADB授予的特殊权限。无论如何,为什么要更改显示器的分辨率? 降低显示器的分辨率可减少GPU的负载。 某些游戏可能比宽屏...

    asp.net知识库

    利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托:一个C#睡前故事 [推荐] - [原创] Microsoft .NET策略及框架概述 卸载Class? Web Form 窗体 如何实现web...

    PHP和MySQL Web开发第4版pdf以及源码

    16.2.1 访问或修改敏感数据 16.2.2 数据丢失或破坏 16.2.3 拒绝服务 16.2.4 恶意代码注入 16.2.5 服务器被攻破 16.3了解与我们“打交道”的用户 16.3.1 破解人员 16.3.2 受影响机器的未知情用户 16.3.3 对公司不满的...

    PHP和MySQL WEB开发(第4版)

    16.2.1 访问或修改敏感数据 16.2.2 数据丢失或破坏 16.2.3 拒绝服务 16.2.4 恶意代码注入 16.2.5 服务器被攻破 16.3了解与我们“打交道”的用户 16.3.1 破解人员 16.3.2 受影响机器的未知情用户 16.3.3 对公司不满的...

    PHP和MySQL Web开发第4版

    16.2.1 访问或修改敏感数据 16.2.2 数据丢失或破坏 16.2.3 拒绝服务 16.2.4 恶意代码注入 16.2.5 服务器被攻破 16.3了解与我们“打交道”的用户 16.3.1 破解人员 16.3.2 受影响机器的未知情用户 16.3.3 对公司不满的...

Global site tag (gtag.js) - Google Analytics