有些时候由于由于项目需要,我们在只知道类名和方法名的情况下需要去访问那个类的私有方法和属性。
下面是两者是在只知道类名的情况下去访问那个类私有变量和方法的例子:
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));
}
}
反射真的是一种很好的技术,用程序员的话:很好!很强大!...
愿多多指正。谢谢!