`

利用java的反射机制来访问类中的私有成员变量,私有构造方法,私有方法

    博客分类:
  • Java
阅读更多

 

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#net反射实现访问类中的私有变量或者方法

    在本篇文章中,我们将深入探讨如何利用C#中的反射机制来访问类中的私有变量或方法。通过一个具体的示例代码,我们将详细了解反射的基本概念、使用场景以及如何具体操作。 ### 一、C#反射机制简介 #### 1.1 什么是...

    反射修改私有成员变量例子

    在本例中,我们将使用 Java 反射机制来修改私有成员变量的值。 什么是 Java 反射机制? Java 反射机制是 Java 语言中一个内置的机制,它允许程序在运行时检查和修改类的结构和行为。反射机制提供了一种方式来在...

    JAVA反射机制的入门代码

    在Java中,反射主要通过`java.lang.Class`类和`java.lang.reflect`包中的几个关键类(如`Constructor`、`Method`和`Field`)来实现。当你在程序运行时获取到一个类的`Class`对象,你就可以获取该类的所有信息,包括...

    Java反射机制

    - **动态代理**:利用反射机制可以动态地创建代理类。 - **框架开发**:许多框架(如Spring、Hibernate)都大量使用反射机制来实现其功能。 - **代码解析**:在开发IDE时,可以通过反射来获取类的信息进行代码提示和...

    Java对类私有变量的暴力反射技术讲解

    另外, Java中的反射机制还提供了一些其他的方法来访问和修改私有变量,例如使用getMethod方法来获取私有方法,使用getConstructor方法来获取私有构造方法等。这些方法可以帮助我们更方便地访问和修改私有变量。 ...

    Java反射机制 Java反射机制

    Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用类的方法等。通过反射,程序可以动态地创建对象和调用其方法,从而实现更灵活的功能。 #### 二、Java反射机制的由来与发展 Java反射机制...

    Java反射机制的实现_Reflection

    通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及执行其他动态操作。这一机制为Java提供了高度的灵活性和强大的元数据访问能力,尤其是在框架、插件系统和...

    JAVA反射机制详解

    - ReflectTester类:这个类提供了一个copy方法,展示了如何通过反射机制来创建一个和给定对象具有相同类型的新对象,并将原对象的所有属性复制到新对象中。这个例子特别适用于简单的JavaBean,它假定JavaBean的属性...

    Java反射机制总结

    - **元数据查询**:开发人员可以利用反射来查询类的元数据,如字段名、方法签名等。 - **动态调用方法**:可以通过反射动态地调用类的方法,这对于实现回调机制、插件架构等很有帮助。 - **动态创建实例**:反射可以...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    java 反射机制详解

    - **测试工具**:JUnit 等测试框架利用反射来调用私有方法或构造函数。 - **动态代理**:在不修改原有代码的情况下,为类添加额外的功能。 然而,反射也存在一定的性能开销,因为它打破了 Java 的封装性和安全性,...

    java 反射机制例子

    在Java中,反射机制是一种非常重要的特性,它使得程序能够在运行时动态地获取类的内部信息,如类名、构造器、成员变量和方法等,并且能够直接操作这些内部结构。通过这种方式,Java反射为开发者提供了极高的灵活性,...

    Reflection_in_Java.zip_in_java 反射_java 反射机制_java反射_反射机制

    在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包下的类如`Constructor`、`Method`和`Field`等。通过这些类,我们可以实现对Java对象的深度控制,比如访问私有属性、调用私有方法、创建对象等。...

    Java 反射机制 代码的实例

    - 测试工具:JUnit等测试框架利用反射调用私有方法进行测试。 - 数据序列化/反序列化:如JSON转换库Gson使用反射将对象转化为JSON字符串。 6. **反射的基本操作**: - 获取类信息:`Class<?> clazz = Class.for...

    Java反射机制经典案例

    在Java中,反射的核心类包括`Class`、`Constructor`、`Method`和`Field`。这些类代表了Java类、构造器、方法和字段的元数据。以下是对这些关键概念的详细解释: 1. `Class`类:每个Java类在运行时都有一个与之对应...

    android系统java反射机制详解

    在Android系统中,Java反射机制同样被广泛应用,尤其是在动态加载类、处理不确定类型的对象、调用私有方法或者访问私有变量等方面。下面将深入探讨Java反射机制的概念、原理及在Android开发中的应用。 一、Java反射...

    java反射机制详解

    在Java中,所有的类型都是`Class`类的实例,因此可以通过`Class`类来访问任何类型的数据结构。反射的核心能力在于可以在运行时: - 获取类的所有属性和方法。 - 创建和操作对象。 - 调用类的方法。 - 获取和设置...

    JAVA反射机制

    - **访问私有成员**:反射可以访问类的私有成员,包括私有变量和方法。 - **调用方法**:可以通过反射调用类的方法,即使这些方法是私有的。 - **修改字段值**:可以使用反射来修改类的字段值,无论这些字段是否私有...

    Java反射机制总结(实例分析)

    通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),甚至能够在不知道具体类名的情况下创建对象并调用其成员。这种能力使得Java代码具有了一定的动态性,...

Global site tag (gtag.js) - Google Analytics