是否可以通过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.
}
}
}
不,不是通过反射。
Reflection询问类及其成员,您可以更改字段,但不能创建新字段。不能添加新方法
可以使用字节码操作库向类中添加方法;但你为什么要这么做?
你不能调用这些方法,除非通过反射,因为它们在编译时显然不存在。
也许可以看看项目Lombok——这是一个注释预处理器,可以在编译时向类添加方法。它会自动添加getter和setter,只要你的类被正确注释。
No。你不能通过反射来添加方法。在本例中,我将使用像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