我有以下奇怪的需求。
我得到:
- 方法名称列表
- 上述方法的参数名称和类型。
- 上述方法的功能。具体如下:对于每个参数,该方法使用
toString
将其转换为字符串,并获得字符串数组。对于这个数组,该方法应用一个函数foo
。foo
函数以String []
类型为输入,输出String
。这些方法返回foo
返回的内容。foo
的代码在Java对象中给出,并作为黑盒访问。
1中的信息。和2。可以在文本或XML文件中。出于这个目的,我们可以认为它可以以我们选择的任何方式在Java对象中可用。
任务是创建一个.class
文件(即字节码)来实现这些方法,并且可以在JVM上运行。
我认为这个汇编库将是一种方法。谁能提出一个更简单的方法?
[EDIT:]我可以想到另一种方法:首先生成.java
文件,然后编译它以获得.class
文件。
[The context:]我必须为几百个方法这样做。我想要快捷方式,这样我就可以自动化我的工作,而不是手动编写代码。
您可以用Java语法生成所需的程序代码,并使用编译器将其转换为类文件。可以在运行时实例化javac
,并传递给它一个字节数组,而不是源文件的位置。对于其他程序员来说,这可能是最容易维护的。
如果你想直接生成字节码,asm是最常用的库。
这里是一个开源字节码库列表:http://java-source.net/open-source/bytecode-libraries
看一下Javassist。
我看到你回答了我的评论,但我仍然不清楚为什么你要生成代码,然后打包在一个罐子里,只是键入它:)
现在,如果你想要一个类型安全的api,所有方法都具有相同的行为,你可以为给定的接口提供一个动态代理(这给你留下了如何生成接口的问题:)
下面是一个示例,其中所有对MyInterface方法的调用都将由invoke方法处理(只需向接口添加方法来测试它)…
package test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Test {
interface MyInterface {
String methodOne(String s);
String methodTwo(String s, Integer i);
}
static MyInterface proxy = (MyInterface) Proxy.newProxyInstance(
MyInterface.class.getClassLoader(),
new Class[] { MyInterface.class }, new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
StringBuilder result = new StringBuilder();
for (Object arg : args) {
result.append(arg.toString());
}
return result.toString();
}
});
public static void main(String[] args) {
System.out.println(proxy.methodOne("hello"));
System.out.println(proxy.methodTwo("world", 5));
}
}