下面代码是java反射应用的一个小例子
通过反射实现了对一个对象属性copy的。
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectTest {
public static Object copy(Object obj) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
//获取class对象
Class<?> clazzType = obj.getClass();
//通过class对象生成实例
Object copyObj = clazzType.getConstructor(new Class[]{})
.newInstance(new Object[] {});
//获取对象的Field
Field [] fields = clazzType.getDeclaredFields();
//遍历所有Field把值set到生成的新实例中
for(Field field : fields) {
//获取对象属性名字
String name = field.getName();
//将属性名字首字母转换为大写
String firstWord = name.substring(0,1).toUpperCase();
//获取set方式名字
String setMethodName = "set" + firstWord + name.substring(1);
//获取set方式名字
String getMethodName = "get" + firstWord + name.substring(1);
//获取set方法对象
Method setMethod = clazzType.getDeclaredMethod(setMethodName, new Class [] {field.getType()});
//获取get方法对象
Method getMethod = clazzType.getDeclaredMethod(getMethodName, new Class [] {});
//通过反射调用被复制对象的get方法获取value
Object value = getMethod.invoke(obj, new Object [] {});
//将获取的到value set到复制的对象
setMethod.invoke(copyObj, new Object [] {value});
}
return copyObj;
}
public static void main(String[] args) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
Customer c = new Customer(123l,1);
Customer copyc = (Customer)copy(c);
System.out.println(copyc);
}
}
class Customer {
private Long l;
private int i;
public Customer(){
}
public Customer(Long l, int i) {
super();
this.l = l;
this.i = i;
}
public Long getL() {
return l;
}
public void setL(Long l) {
this.l = l;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
@Override
public String toString() {
return "Customer [l=" + l + ", i=" + i + "]";
}
}
运行结果:Customer [l=123, i=1]