访问操作类私有属性和方法的两种方式

 

 有些时候由于由于项目需要,我们在只知道类名和方法名的情况下需要去访问那个类的私有方法和属性。

下面是两者是在只知道类名的情况下去访问那个类私有变量和方法的例子:

 

1.通过内部类。(这种方式需要事先知道以后要被访问,故而设置成内部类的方式,不过这种方式用起来有点牵强,个人觉得)

 

例子:

package com.jeelon.test1;

/**
 * 内部类实现访问一个类的私有方法
 * 
 * @author Jeelon
 * 
 */
class TestInner1 {
	private void hello() {
		System.out.println("Hello,I   am   Private ");
	}

	public class Inner {
		public void hello1() {
			hello();
		}
	}

}

class TestInner {
	public static void main(String[] args) {
		new TestInner1().new Inner().hello1();
	}
}


2. 反射

这种方式就是很常用的了,反射是java最高级的技术,这就不用我雜了把。

 

Test2类:里面有私有的变量和方法:

package com.jeelon.test1;

/**
 * 定义私有方法和变量让其他类访问
 * 
 * @author Jeelon
 * 
 */
public class Test2 {
	private int i = 5;
	private String h = "hello";

	private void test() {
		System.out.println("this is a ");
	}

	private String getStr(String jeelon) {
		System.out.println(jeelon);
		return jeelon;
	}
}


下面定义访问Test2内部私有变量和属性的类:

 

package com.jeelon.test1;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 使用反射调用对象私有方法,私有属性
 * 
 * @author Jeelon
 * 
 */
public class FangWenPrivate {
	public static void main(String[] args) throws Exception {
		tt2();
	}

	private static void tt2() throws Exception {

		// 获得类对象
		Object obj = Class.forName("com.jeelon.test1.Test2").getConstructor()
				.newInstance();

		// 调用别的类的无参无返回私有方法;
		Method method = obj.getClass().getDeclaredMethod("test", null);
		method.setAccessible(true);
		Object o = method.invoke(obj, null);
		System.out.println("返回:" + o);
		System.out.println("---------------------------");

		// 调用别的类的有参又返回私有方法;
		Method method2 = obj.getClass().getDeclaredMethod("getStr",
				String.class);// getStr : 方法名. String.class:参数类型
		method2.setAccessible(true);
		Object o1 = method2.invoke(obj, "Heelon");
		System.out.println("返回:" + o1);

		// 调用别的类的私有属性
		Field field = obj.getClass().getDeclaredField("i");
		field.setAccessible(true);
		System.out.println("获得类的私有属性:" + field);
		System.out.println("获得obj私有属性的值:" + field.getInt(obj));

		// 调用别的类的私有属性
		Field field2 = obj.getClass().getDeclaredField("h");
		field2.setAccessible(true);
		System.out.println("获得类的私有属性:" + field2);
		System.out.println("获得obj私有属性的值:" + field2.get(obj));
	}

}


 

 

反射真的是一种很好的技术,用程序员的话:很好!很强大!...

愿多多指正。谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值