使用编译器插件编译后如何修改java字节码?

How to modify java bytecode after compilation using compiler plugins?

提问人:Mikhas 提问时间:9/24/2023 更新时间:9/24/2023 访问量:44

问:

我想在编译阶段/之后但在打包之前修改一些 java 类字节码,以便使用自定义引导方法。invokedynamic

为此,我使用扩展模块编写了一个 Java 编译器插件,并附加了一个在字节码生成阶段后执行的侦听器,但是,该模块的公共 API 不公开任何方法或引用字节码流或生成的文件。jdk.compilercom.sun.source.util.Pluginjdk.compiler.class

我还有其他可以遵循的策略吗?

到目前为止,代码如下所示:

package plugin;

import com.sun.source.util.JavacTask;
import com.sun.source.util.Plugin;
import com.sun.source.util.TaskEvent;
import com.sun.source.util.TaskListener;

public class Main implements Plugin, TaskListener {

    @Override
    public String getName() {
        return "my-plugin";
    }

    @Override
    public void init(JavacTask task, String... args) {
        task.addTaskListener(this);
    }

    @Override
    public void finished(TaskEvent e) {
        if(TaskEvent.Kind.GENERATE.equals(e.getKind())){
            System.out.println("no byte code reference here :(");
        }
    }

    @Override
    public boolean autoStart() {
        return true;
    }
}
java javac 字节码 java-compiler-api

评论

0赞 WJS 9/24/2023
为什么?请解释您的用例。
0赞 Mikhas 9/24/2023
我想使用不同的 Lambda 引导方法,而不是编译器坚持到编译的类文件的默认实现。LambdaMetafactory
1赞 Holger 9/25/2023
似乎没有预见到这一点。只有调用 的方法或首先提供 方法的编译发起者才能访问生成的类文件。JavacTaskgenerate()JavaFileManager

答: 暂无答案