我是反思的新手,我尝试用它锻炼......
这是代码......
for (java.lang.reflect.Field field : fields) {
String getter = "get"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);
String setter = "set"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);
java.lang.reflect.Method getterMethod;
java.lang.reflect.Method setterMethod;
try {
getterMethod = this.getClass().getMethod(getter, null);
Object valueGetted = getterMethod.invoke(this, null);
Class[] paramForSetter = new Class[1];
paramForSetter[0] = valueGetted.getClass();
setterMethod = p.getClass().getMethod(setter, paramForSetter);
setterMethod.invoke(p.getClass(),XXXX);
System.out.println("");
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-Trace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我认为这是一个愚蠢的问题..在XXXXX上我想要一个具有值类型和值的对象...
我认为这很有用......但不是..
setterMethod.invoke(p.getClass(),(valueGetted.getClass().getName()) valueGetted );
帮助!
答案 0 :(得分:3)
您可能希望从apache commons查看BeanUtils的代码。以下函数应该是有用的cloneBean()和copyProperties()。
答案 1 :(得分:1)
正确的代码应如下所示: 注意事项: - 需要使用getDeclaredFields() - getters不以get for boolean字段开头 - 需要使用正确的参数调用setter.invoke() - 获取setter [handle primitive types]
时使用field.getType()import java.lang.reflect.Field;
public class Main {
private static MyObject clone(MyObject p) {
final MyObject clone = new MyObject();
Field[] fields = p.getClass().getDeclaredFields();
for (java.lang.reflect.Field field : fields) {
// Boolean properties will hav eis prefix instead of get
String getter = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
String setter = "set" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
java.lang.reflect.Method getterMethod;
java.lang.reflect.Method setterMethod;
try {
getterMethod = p.getClass().getMethod(getter, null);
Object valueGetted = getterMethod.invoke(p, null);
Class[] paramForSetter = new Class[1];
paramForSetter[0] = valueGetted.getClass();
setterMethod = p.getClass().getMethod(setter, field.getType());
setterMethod.invoke(clone, valueGetted);
System.out.println(" Successfully copied " + field.getName());
} catch (Exception ex) {
System.err.println(" Error copying " + field.getName() + ": " + ex.getMessage());
}
}
return clone;
}
public static void main(String[] args) {
MyObject m = new MyObject(1, 2L, "3", true);
System.out.println("Main.main: Original = " + m);
MyObject c = clone(m);
System.out.println("Main.main: Clone = " + c);
}
}
class MyObject {
private int myInt;
private Long myLong;
private String myString;
private Boolean myBool;
MyObject() {
}
MyObject(int myInt, Long myLong, String myString, Boolean myBool) {
this.myInt = myInt;
this.myLong = myLong;
this.myString = myString;
this.myBool = myBool;
}
public int getMyInt() {
return myInt;
}
public void setMyInt(int myInt) {
this.myInt = myInt;
}
public Long getMyLong() {
return myLong;
}
public void setMyLong(Long myLong) {
this.myLong = myLong;
}
public String getMyString() {
return myString;
}
public void setMyString(String myString) {
this.myString = myString;
}
public Boolean isMyBool() {
return myBool;
}
public void setMyBool(Boolean myBool) {
this.myBool = myBool;
}
@Override
public String toString() {
return "MyObject{" +
"myInt=" + myInt +
", myLong=" + myLong +
", myString='" + myString + '\'' +
", myBool=" + myBool +
'}';
}
}
答案 2 :(得分:0)
给出一个吸气剂Method m
,
m.getReturnType().newInstance()
只要f
的类型是具有public
零参数构造函数的public
具体类型(不是接口或抽象类),就会构造一个实例。它不适用于公共的,非静态的内部类。
它也不适用于Integer.TYPE
等原始返回类型。
因此,考虑到大量的警告,最好的办法是编写一个查看返回类型并创建对象的方法。这样,您可以返回Collections.emptyList()
作为抽象但常用的返回类型List
,并可以0
返回int
。
答案 3 :(得分:0)
我认为通过使用Java Reflection API提供的方法而不是尝试手动获取getter和setter方法的名称,如果你想要juste get和设置字段值,这会更简单。
此类函数可用于获取字段值:
Object getFieldValue(Field afield, Object obj){
if(!field.isAccessible()) field.setAccessible(true);
return field.get(obj);
}
您可以使用field.set(obj,value)...
获取字段的值