是否可以通过java中的反射向类添加方法?
public class BaseDomain {
public BaseDomain(){
Field[] fields = this.getClass().getDeclaredFields();
for(int i=0; i<fields.length; i++){
String field = fields[i].toString();
String setterMethod = "public void set" + field.toLowerCase();
//Now I want to add this method to this class.
}
}
}
答案 0 :(得分:11)
不,不是通过反思。
反思询问类及其成员,您可以更改字段但不能创建新字段。您无法添加新方法。
您可以使用a bytecode manipulation library向类添加方法;但你为什么要这样做?
除了通过反射之外,你无法调用这些方法,因为它们在编译时显然不存在。
也许看看project Lombok - 这是一个注释预处理器,可以在编译时向类添加方法。只要您的类被正确注释,它就会自动添加getter和setter。
答案 1 :(得分:0)
没有。您无法通过反射添加方法。在这种情况下,我将使用像Beanshell 2这样的脚本语言。这是一个DynamicObject类
public class DynamicObject
{
bsh.Interpreter interpreter = null;
public DynamicObject()
{
interpreter = new bsh.Interpreter();
}
public void addToSource(String... method)
{
try
{
String main = "";
for (int i=0; i<lines.length; i++){
main += lines[i] + "\n";
}
interpreter.eval(main);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public Object invoke(String methodname, Object... args)
{
try
{
return interpreter.getNameSpace().invokeMethod(methodname, args, bsh);
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
public Object invoke(String methodname)
{
return invoke(methodname, (Object[])null);
}
}
现在示例动态对象看起来像
DynamicObject testObj = new DynamicObject();
testObj.addToSource(
"public int add ( int a, int b )",
"{",
"return a+b;",
"}"
);
int added = testObj.invoke( "add", 5, 4 ); // is 9