通过反射来更改访问权限
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的值);
分享到:
相关推荐
例如,`Field`类提供了`get()`和`set()`方法来访问和修改字段的值,`Constructor`和`Method`类则提供了`newInstance()`和`invoke()`方法来实例化对象和调用方法。 反射在Java中广泛应用于各种场景,如框架开发(如...
方法一:修改访问权限修饰符 -------------------------------- 这种方法是最简单也是最直接的方法,就是利用 Java 语言自身的特性,达到访问非公有成员的目的。我们可以将 private 和 protected 关键字改为 public...
- 许多设计模式如工厂模式、单例模式等都利用了访问权限控制来实现特定的结构和行为。 9. Java反射API与访问权限: - 尽管Java的反射API允许在运行时访问和修改私有成员,但这应谨慎使用,因为它打破了封装性,...
此外,源代码可能还会涉及访问权限与Java反射API的交互,因为反射允许在运行时动态访问和修改类的私有成员,这在某些高级应用场景中是必需的,但也增加了潜在的安全风险。 为了深入理解这些概念,你可以解压文件,...
总的来说,通过Java的注解和反射机制,我们可以构建出一个高度抽象且具有通用性的数据库访问接口,它能够适应各种不同的数据模型,极大地提高了代码的灵活性和可维护性。同时,理解Android应用的基本结构,如...
3. **设置访问权限**:由于私有成员变量默认不允许外部访问,因此我们需要使用Field对象的`setAccessible(true)`方法,将其可访问性设置为true,这样就可以绕过访问控制检查。 4. **修改成员变量值**:最后,通过...
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp...
本文将详细介绍如何利用Java反射和自定义注解来实现在Struts2框架中的方法级别权限控制。 #### 二、核心概念简介 **1. Struts2框架** Struts2是一个基于Java的开源Web应用程序框架,它继承了Struts1的优良特性,...
- **设置和获取字段值**:`set()`和`get()`方法分别用于设置和获取字段值,但需要注意访问权限的问题。 - **调用方法**:`Method`对象提供了`invoke()`方法,可以用于动态调用类的方法。`getMethod()`用于获取公共...
- `getDeclaredField(String name)`:获取命名的字段(不受访问权限限制)。 - `getDeclaredFields()`:获取所有字段(不受访问权限限制)。 - **方法**: - `getMethod(String name, Class<?>... parameterTypes...
3. 使用安全的反射机制:使用安全的反射机制来访问和修改类的信息,避免恶意代码的出现。 结论 Java 反射机制是一种强大功能,但也存在安全隐患。为了避免这些隐患,需要采取安全编码实践,使用安全的类加载器、...
4. 设置访问权限:如果要访问私有字段,需要先调用`Field`对象的`setAccessible(true)`方法,以绕过访问控制检查。 5. 赋值:最后,使用`Field`对象的`set()`方法,传入目标对象和要赋的值,即可完成属性赋值。例如...
下面我们将通过具体的代码示例来展示如何使用反射访问一个私有的内部类。 ```java Class cls = DefaultHandler.class; try { Constructor con = cls.getConstructor(); Object o = con.newInstance(); ...
- **修改程序行为**:例如,通过反射绕过访问权限限制,实现更灵活的代码结构。 **1.3 反射的实现方式** 反射主要通过`System.Reflection`命名空间下的类实现,包括但不限于: - `Type`: 表示一个类型的信息。 - ...
// 必须打开访问权限 nameField.set(personInstance, "John Doe"); // 调用私有方法 Method sayHelloMethod = personClass.getDeclaredMethod("sayHello"); sayHelloMethod.setAccessible(true); ...
同时,反射可能导致安全风险,因为它可以访问和修改原本受限的类和方法,所以在使用时需要注意权限控制。 综上所述,Java的类反射是一个强大且灵活的工具,为开发者提供了许多在编译时无法实现的功能。但同时,也...
反射机制的核心在于能够在运行时动态地获取类的信息,并且可以动态调用对象的方法,创建对象,甚至修改对象的属性。这种特性使得Java具备了一定的动态性,虽然在传统的分类中,Java被视为静态类型语言,但反射的存在...
需要注意的是,由于访问控制,访问私有字段可能需要设置访问权限,使用`setAccessible(true)`。 5. **调用方法**: `Method`类表示类的方法。我们可以使用`getMethod()`或`getDeclaredMethod()`来获取方法,然后...
反射就是通过System.Reflection命名空间提供的类来访问和操作这些元数据的能力。它允许我们在运行时动态地创建对象、调用方法、访问属性,甚至修改类的行为。 在WinForms应用程序中,通常我们静态地定义了窗体...