杂言碎语:
可以通过反射获取到类中的私有方法和私有成员变量。
本例中Home类和Student类均是原始数据类,反射的使用对象。ReflectionTest类是反射的实现类~
package testReflect;
/**
* @author scott
* @date 2012.8.31
*/
public class Home {
private String sheng = "";
private String shi = "";
private String xian = "";
public Home(String sheng, String shi, String xian){
this.sheng = sheng;
this.shi = shi;
this.xian = xian;
}
public String getSheng() {
return sheng;
}
public void setSheng(String sheng) {
this.sheng = sheng;
}
public String getShi() {
return shi;
}
public void setShi(String shi) {
this.shi = shi;
}
public String getXian() {
return xian;
}
public void setXian(String xian) {
this.xian = xian;
}
}
==================================分割======================================
package testReflect;
/**
* @author scott
* @date 2012.8.31
*/
public class Student {
private Integer id = 1;
private String name = "sdc";
private Home home;
public Student() {
}
public Student(Integer id, String name, String sheng) {
this.id = id;
this.name = name;
home = new Home(sheng, "2", "3");
}
private int getId() {
return this.id;
}
public Home getHome() {
return home;
}
private void sayHello(String name) {
System.out.println("hello ~" + name);
}
}
=====================================分割==================================
package testReflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
/**
* <Test>
* @author scott
* @date 2012.8.31
*/
@SuppressWarnings("unchecked")
public class ReflectionTest
{
// 访问私有方法
@Test
public void accessPrivateMethod() throws Exception
{
System.out.println("调用私有方法");
Class clazz = Student.class;
Student student = (Student)clazz.newInstance();
Object object = null;
Method[] methods = clazz.getDeclaredMethods();
for (Method m : methods)
{
m.setAccessible(true);
if(m.getName().endsWith("sayHello"))
m.invoke(student, "Scott!");
else
object = m.invoke(student, null);
System.out.println(m.getName());
System.out.println(object == null ? "object is 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, String.class});
Student s = con.newInstance(new Object[] {3, "sdc", "fuc"});
Home home = (Home)getValue(clazz, "home").get(s);
getValue(clazz, "home").setAccessible(false);
System.out.println(home.getSheng());
}
/**
* 访问私有变量值
* @throws NoSuchFieldException
* @throws SecurityException
*/
private static Field getValue(Class clazz, String obj)
throws IllegalAccessException, SecurityException, NoSuchFieldException
{
Field[] fields = clazz.getDeclaredFields();
Field field;
field = clazz.getDeclaredField(obj);
field.setAccessible(true);
return field;
}
}