如何生成字节码并保存到.class文件



我有以下奇怪的需求。

我得到:

    方法名称列表
  1. 上述方法的参数名称和类型。
  2. 上述方法的功能。具体如下:对于每个参数,该方法使用toString将其转换为字符串,并获得字符串数组。对于这个数组,该方法应用一个函数foofoo函数以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));
}   
}

相关内容

  • 没有找到相关文章

最新更新