Java从现有依赖项调用未知代码或方法,但尚未调用

Java从现有依赖项调用未知代码或方法,但尚未调用,java,dependency-injection,compilation,Java,Dependency Injection,Compilation,我有两个独立的项目基本和以下设置扩展 项目A: class Handler { public void handle(){ ... } } 项目B import Handler; //from Proejct A class SomeClass{ someMethod() { handle(); //dependency to Project As class with handle method } } 因此,问题在

我有两个独立的项目基本和以下设置扩展

项目A:

class Handler {
    public void handle(){
        ...
    }    
}
项目B

import Handler; //from Proejct A

class SomeClass{
    someMethod() {
        handle(); //dependency to Project As class with handle method
    }
}
因此,问题在于对handle方法的依赖性,handle方法存在于项目A中,但不存在于项目B的编译时

最后一步是将构建项目扩展作为jar,并将其导入到ProjectBasic中

Ofc编译器在我构建项目B时会给我错误,因为句柄在编译时是未知的

对于这个问题,我需要一个解决方案:

或者:告诉java缺少的代码(带有handle方法的导入类)将在运行时出现

或者可能是工厂模式导致的依赖注入。 我知道工厂的模式,但我不明白它在这种情况下如何帮助我

或者其他解决方案


你能帮我吗?

这两个都不是有效的Java-无法编译。正确的关键字是“类”,而不是“类”

一旦正确,您必须在编译时提供它-您别无选择。没办法

也许您应该看看JavaJDK,并遵循
Java.sql
package:Interfaces中的说明<代码>连接,
结果集
语句
等都是接口,因此供应商可以提供自己的实现。用户只处理接口

您的
GenericHandler
应该是您提供给客户机的接口。他们添加自己的实现,并在运行时添加包含自定义实现的JAR文件

所有扩展实现的基本接口:

public interface GenericHandler {
    void genericHandle();
}
分机代码:

import GenericHandler;

public class Extension implements GenericHandler {
    public void genericHandle() { 
        // Do something useful here
    }
}
工厂模式只有在提供有限的、封闭的实现集时才有效:

public class GenericHandlerFactory {
    private final GenericHandlerFactory instance = new GenericHandlerFactory();

    private GenericHandlerFactory() {}

    public GenericHandler getInstance() { return this.instance; }

    public GenericHandler createHandler(Class genericHandlerClass) {
        GenericHandler result = null;
        // Code to create the GenericHandler you want.
        return result;
    }    
}

如果用户可以在你不知情的情况下扩展你的界面,那么工厂就不能工作;您必须坚持使用JDBC示例。

这两个示例都不是有效的Java-无法编译。正确的关键字是“类”,而不是“类”

一旦正确,您必须在编译时提供它-您别无选择。没办法

也许您应该看看JavaJDK,并遵循
Java.sql
package:Interfaces中的说明<代码>连接,
结果集
语句
等都是接口,因此供应商可以提供自己的实现。用户只处理接口

您的
GenericHandler
应该是您提供给客户机的接口。他们添加自己的实现,并在运行时添加包含自定义实现的JAR文件

所有扩展实现的基本接口:

public interface GenericHandler {
    void genericHandle();
}
分机代码:

import GenericHandler;

public class Extension implements GenericHandler {
    public void genericHandle() { 
        // Do something useful here
    }
}
工厂模式只有在提供有限的、封闭的实现集时才有效:

public class GenericHandlerFactory {
    private final GenericHandlerFactory instance = new GenericHandlerFactory();

    private GenericHandlerFactory() {}

    public GenericHandler getInstance() { return this.instance; }

    public GenericHandler createHandler(Class genericHandlerClass) {
        GenericHandler result = null;
        // Code to create the GenericHandler you want.
        return result;
    }    
}

如果用户可以在你不知情的情况下扩展你的界面,那么工厂就不能工作;您必须坚持使用JDBC示例。

这两个示例都不是有效的Java-无法编译。正确的关键字是“类”,而不是“类”

一旦正确,您必须在编译时提供它-您别无选择。没办法

也许您应该看看JavaJDK,并遵循
Java.sql
package:Interfaces中的说明<代码>连接,
结果集
语句
等都是接口,因此供应商可以提供自己的实现。用户只处理接口

您的
GenericHandler
应该是您提供给客户机的接口。他们添加自己的实现,并在运行时添加包含自定义实现的JAR文件

所有扩展实现的基本接口:

public interface GenericHandler {
    void genericHandle();
}
分机代码:

import GenericHandler;

public class Extension implements GenericHandler {
    public void genericHandle() { 
        // Do something useful here
    }
}
工厂模式只有在提供有限的、封闭的实现集时才有效:

public class GenericHandlerFactory {
    private final GenericHandlerFactory instance = new GenericHandlerFactory();

    private GenericHandlerFactory() {}

    public GenericHandler getInstance() { return this.instance; }

    public GenericHandler createHandler(Class genericHandlerClass) {
        GenericHandler result = null;
        // Code to create the GenericHandler you want.
        return result;
    }    
}

如果用户可以在你不知情的情况下扩展你的界面,那么工厂就不能工作;您必须坚持使用JDBC示例。

这两个示例都不是有效的Java-无法编译。正确的关键字是“类”,而不是“类”

一旦正确,您必须在编译时提供它-您别无选择。没办法

也许您应该看看JavaJDK,并遵循
Java.sql
package:Interfaces中的说明<代码>连接,
结果集
语句
等都是接口,因此供应商可以提供自己的实现。用户只处理接口

您的
GenericHandler
应该是您提供给客户机的接口。他们添加自己的实现,并在运行时添加包含自定义实现的JAR文件

所有扩展实现的基本接口:

public interface GenericHandler {
    void genericHandle();
}
分机代码:

import GenericHandler;

public class Extension implements GenericHandler {
    public void genericHandle() { 
        // Do something useful here
    }
}
工厂模式只有在提供有限的、封闭的实现集时才有效:

public class GenericHandlerFactory {
    private final GenericHandlerFactory instance = new GenericHandlerFactory();

    private GenericHandlerFactory() {}

    public GenericHandler getInstance() { return this.instance; }

    public GenericHandler createHandler(Class genericHandlerClass) {
        GenericHandler result = null;
        // Code to create the GenericHandler you want.
        return result;
    }    
}

如果用户可以在你不知情的情况下扩展你的界面,那么工厂就不能工作;您必须坚持使用JDBC示例。

“没有办法解决它。”-这不是真的。您可以使用反射来调用编译时不存在的代码。但是,当然,这只是一种方法,如果没有其他方法,并且您知道自己在做什么以及为什么……我将引用JDBC示例:没有反射。我认为简单一点,没有思考,是一个更好的解决方案。就像我所说的工厂模式,我不明白的是,在哪个项目中必须呈现哪些部分;用户提供实现。最后一点是某种界面注入,让用户说“使用我的实现”。对不起,也许我的描述有点误会。extension(现在是SomeClass)类与“extend”关键字无关。我只想说:我有一个独立的项目,它依赖于另一个项目中的一个方法,它可能是扩展类中的一个类变量,即处理程序甚至不必是泛型的。我只需要从项目A(Basic)调用一个方法。(我把名字改为项目A和项目B)“没办法绕过它。”-这不是真的。哟