通过反射,可以设置一个类的field的值,或者调用一个类的方法,或者新生成这个类的实例。
测试代码:
package com.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import junit.framework.TestCase;
public class TestReflect extends TestCase {
public void testMethod() {
try {
Method method = User.class.getDeclaredMethod("setAge", new Class[]{int.class});
User user = new User();
System.out.println(user);
method.invoke(user, 18);
System.out.println(user);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
public void testField() {
try {
Field field = User.class.getDeclaredField("name");
User user = new User();
System.out.println(user);
if (!field.isAccessible()) {
field.setAccessible(true);
}
field.set(user, "yang");
System.out.println(user);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public void testConstructor1() {
try {
Constructor<?> con = User.class.getDeclaredConstructor((Class[])null);
User user = (User)con.newInstance((Object[])null);
System.out.println(user);
} 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();
}
}
public void testConstructor2() {
try {
Constructor<?> con = User.class.getDeclaredConstructor(new Class[]{int.class, String.class});
User user = (User)con.newInstance(20, "yang");
System.out.println(user);
} 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();
}
}
static class User {
private int age;
private String name;
public User() {
}
public User(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [age=" + age + ", name=" + name + "]";
}
}
}