Java 如何强制将对象放入处理程序类

Java 如何强制将对象放入处理程序类,java,interface,handler,Java,Interface,Handler,我已经在这个问题上发布了一些相关代码: 现在我的问题更具体一点 事实上,我正在使用以下“handler”类来调用实现接口IMSSQLStatement的类的方法: public class MSSQLHandler { IMSSQLStatement statement; public MSSQLHandler(IMSSQLStatement statement) { this.statement = statement; } public

我已经在这个问题上发布了一些相关代码:

现在我的问题更具体一点

事实上,我正在使用以下“handler”类来调用实现接口
IMSSQLStatement
的类的方法:

public class MSSQLHandler {

    IMSSQLStatement statement;

    public MSSQLHandler(IMSSQLStatement statement) {
        this.statement = statement;
    }

    public void invoke() throws SQLException {
        statement.executeStatement();
    }

    public List<?> getDataList() throws SQLException {
        return statement.getDataList();
    }
}
公共类MSSQLHandler{
IMSSQL声明;
公共MSSQLHandler(IMSSQLStatement语句){
这个。声明=声明;
}
public void invoke()引发SQLException{
语句。executeStatement();
}
public List getDataList()引发SQLException{
return语句。getDataList();
}
}
现在的问题是如何强制我(或实现我的接口的开发人员)将已实现类的已创建对象放入
MSSQLHandler


也许这是一个糟糕的设计,但我没有找到任何关于我的问题的信息和用例。

是的,您可以使用带有显式构造函数的抽象类,该类会自动调用所有子类:

public abstract class IMSSQLStatement {

    protected IMSSQLHandler handler;

    public IMSSQLStatement() {
        handler = new IMSSQLHandler(this);
    }
}

编辑:(参考评论)

如果希望只有处理程序能够调用
IMSSQLStatement
中的方法,那么这两个类应该放在同一个包中。通过指定
protected
修饰符,仅允许包私有和子类访问。虽然这些方法可以在子类本身中调用,但除了包之外,它在外部是不可访问的

这不会完全解决你的问题。另一种(真正的伪造)方法是反射

要使用反射,您应该在文档中写出子类应该使用的确切方法签名(当然,不要在超类中定义抽象方法),给它private修饰符。处理程序应该通过反射来访问这些方法


请参阅一些描述如何使用反射的文档。这很复杂,超出了SO的范围。

您不能。。。。。。因为除了方法签名实现,接口不能执行任何东西。其他技术有可能吗?可能有一个抽象类?好的,现在在创建实现类的对象时调用处理程序类。但这不是我真正想要的。我仍然可以在处理程序类的“外部”执行实现类的方法。但是我希望只有handler类能够执行这些方法。谢谢!我已经读了一些关于反射的内容来解决这个用例。我只需要使私有方法可访问并调用它。然而,这是一种良好的做法吗?这在一些“官方”java库中使用吗?它们经常在java标准类中使用,例如序列化、LookAndFeel加载等。阅读(第230页)关于反射的优点和缺点