`

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

    JAVA基础知识精华总结 收藏

    ※在所有类成员初始化完成之后,才调用本类的构造方法创建对象。 构造方法的作用就是初始化。 (2) 静态对象的初始化 程序中主类的静态变量会在main方法执行前初始化。 不仅第一次创建对象时,类中的所有静态变量...

    JAVA经典继承与父类调用 geter、seter访问器 构造器

    代码中设计了各个类的基类,设置私有成员变量,利用构造器对成员变量初始化,用geter、seter访问器设置、获取成员变量的值。继承基类并创建对象,在子类中调用父类方法。

    Java开发技术大全(500个源代码).

    DumpMethods.java 使用反射机制来获取类中的方法 getClassName.java 利用反射机制获取类的名字 invokeConstructor.java 利用反射机制调用构造器 invokeMethod.java 利用反射机制调用成员方法 listConstructors....

    实验三 类的定义、封装;构造方法的定义、重载

    实验目的1、掌握类定义的方式,掌握如何在类中定义成员变量和成员方法。 2、掌握如何创建类的对象,掌握如何使用两个或者多个变量引用同一个实例对象。3、了解为什么要对类进行封装,了解如何实现类的封装。4、掌握...

    Java常见面试题整理出来了

    ⑥抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static 类型,并且默认为 public static 类型。 ⑦一个类可以实现多个接口,但只能继承一个...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    在类体中定义的数据、变量和方法称为类的成员, 或称为实例变量和实例方法。 (7) 例如: 下例定义了一个 Point 类 ,并且声明了它的两个变量 x、y 坐标 ,同时实现 init()方法 对 x、y 赋初值 。 class Ponit { int...

    Java2实用教程.rar

    4 2 6构造方法 4 2 7类方法和实例方法 4 2 8值得注意的问题 4 3对象 4 3 1创建对象 4 3 2使用对象 4 3 3于象的引用和实体 4 3 4参数传值 4 4static关键字 4 4 1实例变量和类变量的区别 4 4 2实例方法和类方法的区别 ...

    Java学习笔记(必看经典)

    构造方法是当用类生成对象时,系统在生成对象的过程中利用的方法。 注意:构造方法在生成对象的时候会被调用,但并不是构造方法生成了对象。 构造方法没有返回值。格式为:public 方法名。 构造方法的方法名与类名...

    21天学通Java-由浅入深

    240 12.2.1 创建局部内部类 240 12.2.2 在局部内部类中访问外部类成员变量 240 12.2.3 在局部内部类中访问外部类的局部变量 241 12.2.4 静态方法中的局部内部类 243 12.3 静态内部类 244 12.3.1 创建静态内部类 244 ...

    JAVA面试题最全集

    9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能存在的错误,并说明原因: 二、JSP&Servlet技术 1.描述JSP和Servlet的区别、共同点、各自应用的范围 2.在Web开发中...

    【05-面向对象(下)】

    •即使通过null对象来访问类成员,程序也不会引发NullPointerException。  类成员不能访问实例成员。 单例类 •如果一个类始终只能创建一个对象,称为单例类。须符合以下几个条件:  –1.我们把该类...

    java三大特性说明

     允许存在父子类的关系,一个子类有且只有一个直接的父类(Java中的继承是类之间的单继承.) 当在内存形成类的信息绑定的时候不会出现多个交叉点,结构的清晰程度较高.Java本身的运行效率较低,只能达到C语言的...

    JAVA细节知识

    接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的, 另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般...

    深入浅析SQL封装、多态与重载

    使用成员属性来间接访问类里面的成员变量 访问修饰符 private 私有的 只能在该类中访问 protected 受保护的 只能在该类和它的子类中访问 public 公有的 在任何地方都可以访问 构造方法(函数): 作用:造对象所要...

    Java入门教程(微学苑)-part1

    3.4 访问成员变量和方法 44 3.5 Java访问修饰符 45 3.6 public:公有的 45 3.7 protected:受保护的 45 3.8 private:私有的 46 3.9 默认的:不使用任何关键字 47 3.10 访问控制和继承 47 3.11 如何使用访问控制符 ...

    【04-面向对象(上)】

    •如果访问权限允许,类里定义的属性和方法可以通过类或实例来调用, •有static 修饰的访求和属性,既可通过类来调用,也可以通过实例来调用. 对象.引用和指针 •Person p = new Person();,这行代码创建了一个...

    java 面试题 总结

    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...

    JAVA面向对象知识点详细文档

    面向对象知识点详细文档 知识点如下: ...成员方法 构造方法 private-私有化 封装 this-本对象 分包 static-静态的 继承 super-父类 重写 访问修饰符 Object final 抽象类及抽象方法 接口 多态 对象转型 内部类

    java经典面试2010集锦100题(不看你后悔)

    B) Test类的对象t可以直接访问month变量,但是不能直接访问day变量,因为day为私有变量,只有类内可以访问。 C) 该程序能通过编译并运行,但是如果想得到输出“I am print in Test”的结果,需要在横线处填写t.show...

Global site tag (gtag.js) - Google Analytics