1. 准备一个演示类
package my;
public class Data {
private static int data;
private String name;
private Data(){
}
private Data(int data,String name){
this.data = data;
this.name = name;
}
private void showName(){
System.out.println("Name is:"+name);
}
private static void showData(){
System.out.println("Data is:"+getData());
}
private static int getData(){
return data;
}
private void setData(int data){
this.data = data;
}
private void setString(String name){
this.name = name;
}
}
2.具体访问步骤
package my;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Start {
public static void main(String[] args) {
try {
Class dataType = Class.forName("my.Data");
// 访问私用的构造方法来创建对象实例
Constructor constructor = dataType
.getDeclaredConstructor(new Class[] { int.class,
String.class });
constructor.setAccessible(true);//访问私有成员方法,这句很关键
Data data = (Data) constructor.newInstance(new Object[] {
new Integer(50), new String("hello") });
// 开始访问私有的静态方法showData来打印对象信息
Method showDataMethod = dataType.getDeclaredMethod("showData",
new Class[] {});
showDataMethod.setAccessible(true);
showDataMethod.invoke(null, new Object[] {});//output:Data is:50
//开始访问私有方法showName来打印对象信息
Method showNameMethod = dataType.getDeclaredMethod("showName",
new Class[] {});
showNameMethod.setAccessible(true);
showNameMethod.invoke(data, new Object[] {});//output:Name is:hello
// 开始访问的setData方法来更改对象信息
Method setDataMethod = dataType.getDeclaredMethod("setData",
new Class[] { int.class });
setDataMethod.setAccessible(true);
setDataMethod.invoke(data, new Object[]{new Integer(100)});//设置data域 为100
//开始访问静态私有的成员变量
Field dataField = dataType.getDeclaredField("data");
dataField.setAccessible(true);
System.out.println(dataField.getInt(data));//output:100
dataField.setInt(null, 200);//再次修改私有成员data的值
System.out.println(dataField.getInt(data));//output:200
//开始访问私有成员变量
Field nameField = dataType.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(data,new String("Fuck!"));//修改私有变量name的值
showNameMethod.invoke(data, new Object[] {});//Name is:Fuck!
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
本文转自:http://blog.csdn.net/futuresherlock/article/details/6029091
分享到:
相关推荐
在本篇文章中,我们将深入探讨如何利用C#中的反射机制来访问类中的私有变量或方法。通过一个具体的示例代码,我们将详细了解反射的基本概念、使用场景以及如何具体操作。 ### 一、C#反射机制简介 #### 1.1 什么是...
在本例中,我们将使用 Java 反射机制来修改私有成员变量的值。 什么是 Java 反射机制? Java 反射机制是 Java 语言中一个内置的机制,它允许程序在运行时检查和修改类的结构和行为。反射机制提供了一种方式来在...
在Java中,反射主要通过`java.lang.Class`类和`java.lang.reflect`包中的几个关键类(如`Constructor`、`Method`和`Field`)来实现。当你在程序运行时获取到一个类的`Class`对象,你就可以获取该类的所有信息,包括...
- **动态代理**:利用反射机制可以动态地创建代理类。 - **框架开发**:许多框架(如Spring、Hibernate)都大量使用反射机制来实现其功能。 - **代码解析**:在开发IDE时,可以通过反射来获取类的信息进行代码提示和...
另外, Java中的反射机制还提供了一些其他的方法来访问和修改私有变量,例如使用getMethod方法来获取私有方法,使用getConstructor方法来获取私有构造方法等。这些方法可以帮助我们更方便地访问和修改私有变量。 ...
Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用类的方法等。通过反射,程序可以动态地创建对象和调用其方法,从而实现更灵活的功能。 #### 二、Java反射机制的由来与发展 Java反射机制...
通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及执行其他动态操作。这一机制为Java提供了高度的灵活性和强大的元数据访问能力,尤其是在框架、插件系统和...
- ReflectTester类:这个类提供了一个copy方法,展示了如何通过反射机制来创建一个和给定对象具有相同类型的新对象,并将原对象的所有属性复制到新对象中。这个例子特别适用于简单的JavaBean,它假定JavaBean的属性...
- **元数据查询**:开发人员可以利用反射来查询类的元数据,如字段名、方法签名等。 - **动态调用方法**:可以通过反射动态地调用类的方法,这对于实现回调机制、插件架构等很有帮助。 - **动态创建实例**:反射可以...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...
- **测试工具**:JUnit 等测试框架利用反射来调用私有方法或构造函数。 - **动态代理**:在不修改原有代码的情况下,为类添加额外的功能。 然而,反射也存在一定的性能开销,因为它打破了 Java 的封装性和安全性,...
在Java中,反射机制是一种非常重要的特性,它使得程序能够在运行时动态地获取类的内部信息,如类名、构造器、成员变量和方法等,并且能够直接操作这些内部结构。通过这种方式,Java反射为开发者提供了极高的灵活性,...
在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包下的类如`Constructor`、`Method`和`Field`等。通过这些类,我们可以实现对Java对象的深度控制,比如访问私有属性、调用私有方法、创建对象等。...
- 测试工具:JUnit等测试框架利用反射调用私有方法进行测试。 - 数据序列化/反序列化:如JSON转换库Gson使用反射将对象转化为JSON字符串。 6. **反射的基本操作**: - 获取类信息:`Class<?> clazz = Class.for...
在Java中,反射的核心类包括`Class`、`Constructor`、`Method`和`Field`。这些类代表了Java类、构造器、方法和字段的元数据。以下是对这些关键概念的详细解释: 1. `Class`类:每个Java类在运行时都有一个与之对应...
在Android系统中,Java反射机制同样被广泛应用,尤其是在动态加载类、处理不确定类型的对象、调用私有方法或者访问私有变量等方面。下面将深入探讨Java反射机制的概念、原理及在Android开发中的应用。 一、Java反射...
在Java中,所有的类型都是`Class`类的实例,因此可以通过`Class`类来访问任何类型的数据结构。反射的核心能力在于可以在运行时: - 获取类的所有属性和方法。 - 创建和操作对象。 - 调用类的方法。 - 获取和设置...
例如,对于私有变量`name`,应提供`setName`和`getName`方法,这是Java中封装的重要体现。 【练习题07】:设计`WuMingFen`类表示“无名的粉”,包括面码`theMa`、分量`quantity`和是否带汤`likeSoup`的属性。需要一...
- **访问私有成员**:反射可以访问类的私有成员,包括私有变量和方法。 - **调用方法**:可以通过反射调用类的方法,即使这些方法是私有的。 - **修改字段值**:可以使用反射来修改类的字段值,无论这些字段是否私有...