我知道这个问题现在被问了好几次,但我有一个特例。
我有一个名为JavaPlugin的类,一个名为PluginLoader的类和一个名为InitializeAble的接口。 PluginLoader有一个Method,它加载所有类,这些类从JavaPlugin扩展并包含在JarFiles中,它们包含在文件/文件夹中,你将loadingmethod作为参数。
所以在调用loadmethod之后,你有一个Set<类< ?扩展JavaPlugin>>。
类PluginLoader还有方法initializePlugins(),它运行Set并检查每个类是否实现了InitializeAble。如果类实现了接口,则应创建该类的新实例。这就是我失败的地方
我想有一个静态方法或一个静态字段,它有一个方法,它返回我想要创建的JavaPlugin实例
正如您所看到的,我尝试使用构造函数,注释和接口。但我无法找到一种可行的方法。完美的东西是一个接口,它强制类声明public / protected / private静态JavaPlugin initialize()。这种方法应该像
一样被覆盖
initialize(){
return new CustomPluginClass(...);
}
公共/受保护/私有静态字段也可以。我会为这个字段创建一个接口,它有一个返回JavaPlugin的公共方法。这样我就可以获得该字段,调用其方法并获取实例。 “Serializable”界面做了类似于长字段的界面,但我认为这是一件特别的事情,并且不可能自己创建这样的东西。
我的最后一个想法是让扩展JavaPlugin的类的创建者选择,在他的插件类中哪个方法应该是他的“构造函数”,用注释@PluginConstructor标记它。但是,如果我这样做,我必须确保标记的方法必须返回JavaPlugin并且必须是静态的,因为我不能在没有实例的情况下调用非静态方法。我不确定这样的事情是否可行,因为我对注释知之甚少。此外,每个类允许只有一个@PluginConstructor注释
如果costumpluginclass没有实现InitializeAble,或者它没有PluginConstructor注释或者其他......如果没有初始化插件,它就不会。我希望能够通过实例检查或注释来检查这一点。这就是为什么我不想直接在JavaPlugin中创建一个可以覆盖的方法
如果还有其他解决方案,我也会接受。只要我解决了这个问题。我不知道怎么能做到这一点。希望你能帮帮我
谢谢,巴斯蒂 ps:是的,我看了所有类似的问题,不,那些没有帮助我,抱歉英语不好:P编辑: 我想自己写完整个东西来进行反思练习。但如果本部分没有使用反射,对我来说没问题。只是想知道如何确保库用户不能将插件标记为可初始化而没有我可以加载的构造函数而不会冒险访问可能不存在的东西