1.PrivateObject.java
可以看到PrivateObject 里有一个private 的属性String型的 privateString
没有为其实义getter,setter方法。
package org.iteye.bbjava.runtimeinformation;
import java.lang.reflect.Field;
public class PrivateObject {
private String privateString = null;
public PrivateObject(String privateString) {
this.privateString = privateString;
}
}
2.Test.java
这里将对PrivateObject类进行反射取值,是一种“暴力操作”,相信经常逛论坛的同学们,应该听过这个词。
还可以“暴力修改”。
package org.iteye.bbjava.runtimeinformation;
import java.lang.reflect.Field;
public class Test {
public static void main(String []args) throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException{
PrivateObject privateObject = new PrivateObject("The Private Value");
Field privateStringField = PrivateObject.class.
getDeclaredField("privateString");
privateStringField.setAccessible(true);
String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);
}
}
3.console infomaction:
引用
fieldValue = The Private Value
4.接下来将对Test.java进行修改,以对“暴力修改”是如何做到的进行说明。
对比上面的Test.java这里多了8行代码,这就是“暴力修改”的关键。
其中 privateStringField.setAccessible(true); 就是对private 属性修改的“权限开关”,当设置为true时,可以修改,为false时会抛出异常,动行时信息将会给出该异常.
package org.iteye.bbjava.runtimeinformation;
import java.lang.reflect.Field;
public class Test {
public static void main(String []args) throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException{
PrivateObject privateObject = new PrivateObject("The Private Value");
Field privateStringField = PrivateObject.class.
getDeclaredField("privateString");
privateStringField.setAccessible(true);
String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);
privateStringField.setAccessible(true);
privateStringField.set(privateObject, "As you see,privateString's value is changed!");
String fieldValue1 = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue1);
privateStringField.setAccessible(false);
privateStringField.set(privateObject, "As you see,privateString's value is changed!");
String fieldValue2 = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue2);
}
}
5.console infomaction:
引用
fieldValue = The Private Value
fieldValue = As you see,privateString 'value is changed!
Exception in thread "main" java.lang.IllegalAccessException: Class org.iteye.bbjava.runtimeinformation.Test can not access a member of class org.iteye.bbjava.runtimeinformation.PrivateObject with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at java.lang.reflect.Field.doSecurityCheck(Field.java:960)
at java.lang.reflect.Field.getFieldAccessor(Field.java:896)
at java.lang.reflect.Field.set(Field.java:657)
at org.iteye.bbjava.runtimeinformation.Test.main(Test.java:25)
分享到:
相关推荐
#### 二、反射获取类中的属性及值 下面,我们将通过具体的代码示例来展示如何使用反射来获取类中的所有属性及其对应的值。 ##### 1. 获取类的信息 首先,我们需要获取目标类的信息。这里使用`getClass()`方法来...
我们创建一个名为`ReflectorClass`的辅助类,其中包含一个静态方法`getPropertyName`,这个方法接受一个对象实例作为参数,通过反射获取该对象的所有属性名及对应的类型,并返回一个字符串,每个属性名与类型之间用...
本篇文章将详细探讨如何利用反射来给对象的属性赋值,以及这个过程中的关键知识点。 一、反射的概念 反射是指在程序运行期间获取并操作类、接口、字段和方法等元数据的能力。通过反射,我们可以在运行时动态地创建...
本文主要探讨了如何在C#中利用反射机制动态地设置组件属性,并通过一个具体的案例——Ini文件的访问类来展示反射技术的应用场景。文章还提到了.NET Framework 1.0与1.1之间的差异、Visual Studio 2002与2003的不同之...
- **运行时反射**:除了编译时处理,还可以在运行时通过反射获取注解的值,如`MyAnnotation myAnno = field.getAnnotation(MyAnnotation.class); String value = myAnno.value();` 3. **工具支持**: - **Apache ...
通过这样的方式,我们利用Java反射机制实现了对实体类所有属性的遍历,并在遇到null值时为其赋上默认值,从而避免了因null值导致的问题。这种技术在处理动态数据、序列化和反序列化、框架和库的实现等方面非常有用,...
每个属性都有一个关联的getter和setter方法,可以通过`QObject::setProperty()`和`QObject::property()`来设置和获取属性值。此外,属性系统支持信号和槽机制,当属性值改变时,可以自动触发信号。 2. **定义属性**...
标题“Java反射机制修改私有成员变量的实现_Reflection”着重讲述了如何利用反射来修改私有成员变量的值。在Java中,私有成员变量通常被视为封装的一部分,不被外部类直接访问。然而,通过反射,我们可以绕过这种...
在上面的代码中,我们使用了 Java 的反射机制来获取注解的值。 结论 Java 注解之运行时修改字段的注解值操作是非常有用的技术,可以帮助我们在实际开发中更方便地处理和修改代码。本文主要介绍了 Java 注解之运行...
在本篇文章中,我们将深入探讨如何利用C#中的反射机制来访问类中的私有变量或方法。通过一个具体的示例代码,我们将详细了解反射的基本概念、使用场景以及如何具体操作。 ### 一、C#反射机制简介 #### 1.1 什么是...
2. 使用反射获取`Class1`类型中对应于`DataTable`列名的属性信息。 3. 如果找到了对应的属性,则通过`SetValue`方法设置该属性的值。 4. 将填充好的实体类添加到列表中。 #### 输出结果 最后,我们可以输出第一个...
本篇文章将详细讲解如何利用反射和注解将数据导出到Excel文件中。 首先,我们要了解反射的概念。反射是Java语言提供的一种能力,允许程序在运行时检查和操作类、接口、字段和方法等对象。通过反射,我们可以动态地...
针对你的需求,我们讨论一个自定义的工具类,它支持处理具有public属性以及父类属性的JSON对象,并利用反射机制进行操作。这个工具类名为`JsonUtil`,以下是关于这个工具类及其涉及知识点的详细说明: 1. **public...
在给定的“利用java反射将json字符串转成对象”的主题中,我们将深入探讨如何借助反射机制将JSON字符串转换为Java对象。 首先,我们需要了解JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人...
- 测试工具:JUnit等测试框架利用反射访问私有方法进行测试。 - 反序列化:将序列化的数据恢复为对象时,可能会用到反射来实例化对象。 6. **反射的优缺点** - 优点:灵活性高,能够实现动态编程,增加代码的可...
在本“Java反射经典实例”中,我们将深入探讨这个主题,了解如何利用反射来访问和修改私有属性以及调用私有方法。 1. **反射的概念与用途** - 反射机制是在运行时分析类的能力,它允许我们获取类的信息(如类名、...
在给定的场景中,我们利用反射机制实现了动态调用计算器的加法和减法函数,并修改了学生对象的私有数据成员。下面将详细讲解这些知识点。 首先,让我们关注`Calculator`类中的加法和减法函数。假设`Calculator`类有...
在本例程中,我们将深入探讨如何利用反射机制来动态地修改对象的私有属性值。 首先,我们需要了解反射的核心类`java.lang.Class`,它是Java类的运行时表示。通过`Class`对象,我们可以获取到类的结构信息,如类名、...
在Java编程中,有时我们需要从一个`List`中获取对象的属性值,特别是在处理各种不同类型的对象集合时。本文将详细介绍如何使用Java的反射机制来实现这一目标。 首先,让我们理解一下`List`接口和反射的基本概念。`...