Java 试图用ByteBuddy开发一个相当特定的类加载系统

Java 试图用ByteBuddy开发一个相当特定的类加载系统,java,byte-buddy,Java,Byte Buddy,在我发言之前,我想感谢开发人员花时间为Byte Buddy编写文档。我知道这有多乏味,我很感激 然而,我仍然有一点麻烦与转换我正在做。我做了很多搜索,但是没有太多 目前我使用javassist。该系统可以工作,但它只是在某些方面有所欠缺,并产生了大量的开销。我认为byte buddy可能是解决方案。但是,我正在处理的项目必须进行运行时代码转换。它需要在实时环境中保持稳定,因此热插拔器不是我想要的(但是我发现在测试环境中使用相同的系统非常好) 问题是我需要在某些时候抓取类,并加载几个,以便在加载过

在我发言之前,我想感谢开发人员花时间为Byte Buddy编写文档。我知道这有多乏味,我很感激

然而,我仍然有一点麻烦与转换我正在做。我做了很多搜索,但是没有太多

目前我使用javassist。该系统可以工作,但它只是在某些方面有所欠缺,并产生了大量的开销。我认为byte buddy可能是解决方案。但是,我正在处理的项目必须进行运行时代码转换。它需要在实时环境中保持稳定,因此热插拔器不是我想要的(但是我发现在测试环境中使用相同的系统非常好)

问题是我需要在某些时候抓取类,并加载几个,以便在加载过程中的适当时刻插入插件

在javassist中,(注意这只是一个开始),它的开头是这样的:

public static void main(String[] args) {
    try {

        initLogger();

        Loader loader = HookManager.getInstance().getLoader();
        loader.delegateLoadingOf("javafx.");
        loader.delegateLoadingOf("com.sun.");
        loader.delegateLoadingOf("org.controlsfx.");
        loader.delegateLoadingOf("impl.org.controlsfx");
        loader.delegateLoadingOf("com.mysql.");
        loader.delegateLoadingOf("org.sqlite.");
        loader.delegateLoadingOf("com.xyp.modloader.classhooks.");
        loader.delegateLoadingOf("javassist.");

        Thread.currentThread().setContextClassLoader(loader);

        loader.run("net.xyp.modloader.DelegatedLauncher", args);
    } catch (Throwable e) {
        Logger.getLogger(ServerLauncher.class.getName()).log(Level.SEVERE, e.getMessage(), e);
        e.printStackTrace();
        System.exit(-1);
    }

}
然后代码继续进入插件注入系统中的其他类。它调用更多的类,并在适当的时候激发注入系统中的方法,该方法调用需要在这些时候插入的插件

示例2将类放入系统中,此方法称为public void

public void fireOnServerStarted() {
    ModComm.serverStarted();
    serverStarted.fire(listener -> listener.onServerStarted());
}
当触发时,系统具有插件所针对的接口,告诉系统现在是注入这些插件的正确时机。这发生在几个不同的州,在正确的时间开火是非常重要的。出于某种原因,我没有掌握如何使用Byte Buddy实现这一点,我认为这是因为所有示例都只是加载的单个方法或字段


我考虑过删除这篇文章,因为有人可能有我没有遇到的解决方案。然而,在这个时候,在做更多的研究时,我觉得Byte Buddy并没有包括我从Javassist使用的最重要的功能来完成我试图转换的功能。愿意听到其他选择

我不完全确定我是否理解您的问题,但据我所知,您试图将几个类装入器作为父类装入器委托给它们


Byte Buddy为此提供了
MultipleParentClassLoader
。您发布的示例代码不包含JavaScript代码,因此我不能给您更具体的建议。

对于所有(高级)(字节)代码生成任务,我认为这是一个很好的方法来编写即将生成的类的工作版本。这样,您就可以验证您想要的实际上是可以完成的,并为您这一代人提供一个测试用例。你的描述对你想创造什么的细节很模糊。所以写一个插件机制的最小版本,将它添加到你的问题中,也许你会得到一些关于如何动态生成它的答案。我已经完成了不止一个最小版本,但它使用Javassist,开销开始变得非常高。我主动联系了Byte Buddy开发人员,并愿意支付一个下午的“熟悉”课程的费用。但此时,我认为我经常使用的Javassist最重要的关键特性之一是,使用Byte Buddy根本不可能实现的。因此,我正在研究其他解决方案。我真的很感激你的想法,但是,谢谢你的时间来尝试和澄清。请仔细考虑你的问题,并考虑删除所有部分没有真正的话题。这可能是一个很好的问题,但它隐藏在你谈论与你的问题无关的事情的许多行中。例如,如果你喜欢byte buddy文档,那么就向工具的作者发送一封邮件。但这种赞扬无助于理解你的问题。所以请把它扔掉。