有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

插件Java强制类声明静态方法或静态字段

我知道这个问题已经被问过好几次了,但我有一个特例

我有一个叫做JavaPlugin的类,一个叫做PluginLoader的类和一个叫做Initializable的接口。PluginLoader有一个加载所有类的方法,这些类从JavaPlugin扩展而来,包含在JarFiles中,JarFiles包含在文件/文件夹中,您将loadingmethod作为参数提供给它

因此,在调用loadmethod之后,您有一个集合<;类别<?扩展JavaPlugin>>
此外,类PluginLoader具有initializePlugins()方法,该方法在集合中运行,并检查每个类是否实现了InitializeAble。如果类实现了接口,则应创建该类的新实例。这就是我失败的地方
我希望有一个静态方法或一个静态字段,它有一个方法,返回我想要创建的JavaPlugin实例

  • 我不能调用任何构造函数,因为创建该类(从JavaPlugin扩展而来)的人可能会重写默认的构造函数
  • 我不能强制类实现接口的静态方法或字段
  • 我不能做注释,这会迫使一个方法是静态的并返回一个JavaPlugin
  • 我不想在JavaPlugin中定义一个必须被覆盖的方法,因为我想通过实例检查来弄清楚JavaPlugin是否应该被初始化。为此,我将检查PluginClass是否实现可初始化
  • 我希望该类的创建者(它扩展了JavaPlugin)能够编写自己的构造函数,这样他就可以决定在创建对象时会发生什么

如您所见,我尝试了构造函数、注释和接口。但是我想不出一个可行的办法。最好是一个接口,它强制类声明public/protected/private static JavaPlugin initialize()。此方法应该像
一样被覆盖 initialize(){ return new CustomPluginClass(...); }

公共/受保护/私有静态字段也可以。我将为这个字段创建一个接口,该接口有一个返回JavaPlugin的公共方法。这样我就可以得到字段,调用它的方法并得到实例。接口“Serializable”使用长字段执行类似操作,但我认为这是一件特殊的事情,您不可能自己创建类似的操作

我的最后一个想法是让类的创建者(它扩展了JavaPlugin)选择,在他的pluginclass中的哪个方法应该是他的“构造函数”,方法是用注释@PluginConstructor标记它。但是如果我这样做,我必须确保标记的方法必须返回JavaPlugin并且必须是静态的,因为如果没有实例,我不能调用非静态方法。我不确定这样的事情是否可能,因为我对注释了解不多。此外,每个类只允许有一个@PluginConstructor注释

如果costumpluginclass没有实现可初始化,或者它没有PluginConstructor注释或者其他什么。。。如果插件没有被初始化,它就不会被初始化。我希望能够通过实例检查或注释来检查这一点。这就是为什么我不想直接在JavaPlugin中创建一个可以被覆盖的方法

如果有别的解决办法,我也会接受。只要我能解决这个问题。我再也不知道该怎么做了。希望你能帮助我

谢谢,巴斯蒂
是的,我看了所有类似的问题,没有,这些对我没有帮助,很抱歉英语不好

编辑: 我想自己写这整件事,以便进行反思练习。但是,如果这部分没有使用反射,对我来说没有问题。只是想知道如何确保,库用户在没有构造函数的情况下不能将插件标记为可初始化插件,我可以加载构造函数,而不必冒着访问插件的风险我可能不在那里


共 (0) 个答案