通过反射访问对象的私有变量和执行私有方法
2011-10-19 14:07
441 查看
package reflection.domain; /** * <学生域> * * @author snowday88 */ public class Student { private Integer id = 1; private String name = "wangguobo"; public Student() { } public Student(Integer id, String name) { this.id = id; this.name = name; } private int getId() { return this.id; } private String sayHello() { return this.name; } }
package reflection.refleftionDemo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.junit.Test; import reflection.domain.Student; /** * <Test> * * @author snowday88 */ @SuppressWarnings("unchecked") public class ReflectionTest { // 访问私有变量 @Test public void accessPrivateField() throws Exception { // 方式一 访问私有变量 Class clazz = Class.forName("reflection.domain.Student"); // 创建对象 Object obj = clazz.newInstance(); getValue(clazz, obj); System.out.println("------------------------"); // 方式二 Student student = new Student(); Class clzz = student.getClass(); getValue(clzz, student); System.out.println("-------------------------"); // 方式三 Student stu = new Student(); Class c = Student.class; getValue(c, stu); System.out.println("-------------end---------"); } // 访问私有方法 @Test public void accessPrivateMethod() throws Exception { System.out.println("调用私有方法"); Class clazz = Class.forName("reflection.domain.Student"); Student student = (Student)clazz.newInstance(); Method[] methods = clazz.getDeclaredMethods(); for (Method m : methods) { m.setAccessible(true); Object object = m.invoke(student, new Object[] {}); System.out.println(m.getName()); System.out.println(object == null ? "" : object.toString()); System.out.println("------------------------------------------"); } } // 根据有参数的构造方法构造对象 @Test public void getInstance() throws Exception { Class clazz = Student.class; // 得到有参数的构造方法 Constructor<Student> con = clazz.getConstructor(new Class[] {java.lang.Integer.class, java.lang.String.class}); Student s = con.newInstance(new Object[] {3, "gbwang"}); getValue(s.getClass(), s); } /** * 访问私有变量值 */ private static void getValue(Class clazz, Object obj) throws IllegalAccessException { Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); System.out.println(field.get(obj)); } } }
相关文章推荐
- JavaSE第六十四讲:使用反射机制调用对象的私有方法、访问对象的私有成员变量
- 通过操作地址的方法来访问C++类对象中私有成员变量
- 反射机制的概述和字节码对象的获取,通过反射获取构造方法并使用;通过反射获取成员变量并使用;通过反射获取私有成员变量并使用;通过反射获取成员方法并使用
- java通过反射技术访问私有变量和方法
- Java通过反射访问私有成员变量和私有方法
- 如何通过反射访问私有变量和私有方法
- 通过反射,如何操作私有成员变量(取/赋值),如何调用私有方法?
- 子类用反射可以访问父类中的私有成员变量及方法
- PHP通过反射方法调用执行类中的私有方法
- 如何通过Java反射访问类里面的私有方法和变量
- .net 反射访问私有变量和私有方法
- java反射访问私有变量和私有方法
- 通过反射访问私有方法
- .net 反射访问私有变量和私有方法
- Java中的static关键字解析(转自海子)__为什么main方法必须是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。
- JAVA反射机制 访问对象私有变量和方法
- Hibernate通过什么方法可以把私有成员变量赋值成数据库查询到的值然后返回POJO对象呢?
- 通过反射访问对象私有和保护成员
- iOS开发笔记之七十——如何访问对象的私有方法和变量
- 通过字符串创建对象并访问类中的方法(利用java的反射)