Java 基于我想要隐藏的调用的插件

Java 基于我想要隐藏的调用的插件,java,plugins,Java,Plugins,我想让我的项目有可能通过插件进行扩展。对于该界面的用户,我想创建一个单独的小jar(plugin.jar)文件,公开编写插件所需的所有内容 该插件应该只实现一种方法双重计算(double)。为此,我可以公开一个接口。但是我也希望插件能够调用一些函数double-getParameter(string) 现在它变得很棘手(至少对我来说)。getParameter的实际实现依赖于其他一些jar,我不想在plugin.jar中引用这些jar。(出于清洁的原因,没有更多)所以我不能为我的用户提供某种Pl

我想让我的项目有可能通过插件进行扩展。对于该界面的用户,我想创建一个单独的小jar(plugin.jar)文件,公开编写插件所需的所有内容

该插件应该只实现一种方法
双重计算(double)
。为此,我可以公开一个接口。但是我也希望插件能够调用一些函数
double-getParameter(string)

现在它变得很棘手(至少对我来说)。
getParameter
的实际实现依赖于其他一些jar,我不想在plugin.jar中引用这些jar。(出于清洁的原因,没有更多)所以我不能为我的用户提供某种PluginBase类

我提出的最佳解决方案是使用pImpl习惯用法和附加接口的某种组合:

我公开了一个抽象基类,它通过在一个接口仅包含
getParameter
的对象上调用来实现
final getParameter
。在我的应用程序中创建插件作为该
getParameter
函数的实现时,会传递此对象。然而,这意味着这个PluginBase类需要一个
setImplementation
函数

用户端:

class UserPlugin extends PluginBase
{
   @Override
    public double Calculate(double input)
    {
       return input + this.getDoubleInput("X") + this.getDoubleInput("Y");
    }
}
Jar提供插件接口和类

public interface IHasInputParameters { Double getParameter(String s) } 

public class PluginBase  implements IHasInputParameters 
{
   private IHasInputParameters impl;
   public abstract double Calculate(double input)

   @Override
   public final Double getParameter(String s) { return impl.getParameter(s));}

   public final void SetImplementation(IHasInputParameters i) { this.impl = i;}     
}
内侧

class PluginImpl  implements IHasInputParameters 
{
   @Override
   public final Double getParameter(String s) 
   {  //// do stuff that depends on stuff I don't want to expose}
}
这基本上有效。但必须解决问题

  • 我的用户可以调用SetImplementation并破坏某些内容。(我可以检查,这只在施工时由我调用,之后无效)
  • 插件的初始化很难。插件需要实现调用getParameter,但实现需要插件调用Calculate

    PluginImpl implementation = new PluginImpl ();
    Plugin plugin = new Plugin();
    plugin.setImplementation(implementation);
    implementation.SetImplementation(plugin);    
    

  • 是否有更简单/更安全的方法执行此操作?

    发布代码而不是图片。这是不清晰的。图片不是用来阅读代码,而是用来显示类的位置。图片缩放不好,有别名,文本。它们没有任何作用,只是混淆了岗位。如果它们很重要,请将它们转换为代码。如果它们不重要,请删除它们。好的,我转换了它们的邮政编码而不是图片。这是不清晰的。图片不是用来阅读代码,而是用来显示类的位置。图片缩放不好,有别名,文本。它们没有任何作用,只是混淆了岗位。如果它们很重要,请将它们转换为代码。如果它们不重要,就把它们去掉。好吧,我把它们改了