我正在研究一个项目,其中有很多由库创建的对象,并且我无法访问这些对象的创建过程。是否有可能在Java中运行时实现接口?
下面的片段可以作为一个很好的例子来说明我的问题。
代码:
public class Clazz {
//The contents of Clazz are irrelevant
//Clazz is NOT my class. I have no access to its internal structure.
//However, I do have access to Clazz objects that were created elsewhere.
}
ExampleInterface
是clazz中可能会或可能不会在编译时实现一个接口。
代码:
public interface ExampleInterface {
public void run();
}
下面的代码是,我遇到了这个问题。看看下面的注意事项:
run()
当c是ExampleInterface
一个实例只调用。getRunConditions(Clazz c)
和executeClazz(Clazz c)
都是我无权访问的类中的私有方法。- 在编译时,
Clazz
将而不是包含一个名为run()
的方法。 - ExampleExecutor是不是我的班。我无法使用任何 方式(我甚至无法获得该类的实例)。
代码:
public class ExampleExecutor {
public void executeClazz(Clazz c) {
if ((c instanceof ExampleInterface) && getRunConditions(c)) {
ExampleInterface ex = (ExampleInterface) c;
ex.run();
}
}
}
显然以下方法在语法上不能够,但它确实是我想要的目的。基本上,如果c尚未实现ExampleInterface
,请将c设置为执行ExampleInterface
,然后提供必须覆盖的方法。
需要注意以下的:
extendInterface(
Name of Interface
)
是虚构的语法,试图说明我的目标创造我 。run()
必须在这里定义(在运行时)。- 我不能使用包装或代理类作为解决方案。 IE,
Clazz
对象必须结束执行ExampleInterface
,并且我无法使用解决方法。 (参考this link如果你想知道为什么)。
代码:
public void implementInterface(Clazz c) {
if (!(c instanceof ExampleInterface)) {
c.extendInterface(ExampleInterface {
@Override
public void run() {
//code
}
});
}
}
为了澄清,我正在运行到的问题是,我需要总是知道什么时候run()
被称为Clazz
。如果Clazz
曾经不执行ExampleInterface
,我不知道什么时候应该调用run()
。
与此同时,我还想偶尔为run()
添加支持,默认情况下不支持。因为我无法访问创建Clazz
对象,所以我无法通过自己实现接口来完成此操作。
问题:简单地说,是否可以在运行时实现接口(并提供所需的方法)?
注:而唯一的解决方案可能需要反思(如果有的话,请张贴下文),我使用的库有安全管理器,阻止使用所有的反射。 IE,反思性的解决方案在将来可能对其他人有用,但对我来说没用。
此外,我并不是说只在自己的程序中使用库。一个已经运行的主机应用程序(这是我使用的库)是遵循并且然后运行我为它编写的代码。如果该应用程序不喜欢我提供的任何代码(IE,与其安全管理器冲突),则代码甚至从不编译。
为什么我需要这样做:
它与我使用的图书馆做。因为ExampleExecutor
是我无法访问的方法,而且我无法控制Clazz的创建,所以无法确定run()
何时执行。
我需要知道什么时候run()
被执行的原因是因为实际上,run()
是一个事件处理程序,它是我正在使用的库的一部分。
例如:mouseClicked(CustomMouseEvent evt)
可能是一个方法,它是接口CustomMouseListener
的一部分。有时Clazz
的实例当鼠标点击时(因此继承CustomMouseListener
),我正在小心处理,而其他时间则不会。
与Clazz
实例不同,我总是在意鼠标是否被点击,并始终需要触发该事件。
在现实中,ExampleInterface
实际上是以下几点:
public interface CustomMouseListener {
public void mouseClicked(CustomMouseEvent evt);
public void mousePressed(CustomMouseEvent evt);
public void mouseReleased(CustomMouseEvent evt);
//etc
}
要说清楚,你是不是在问匿名课程? http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html –
你可以用'new SomeInterface(){...}'在运行时创建一个实现接口的实例,但它赢得了' t是其他任何东西的实例(当然除了Object和超接口)。这听起来像你正在获取某个类的实例,只需要检查它是否实现了一个特定的接口,如果是的话,就用它做些什么。是对的吗? –
不,不。参考我已经链接的其他问题,这可能会对我正在努力完成的事情有所了解。 代码'if(c extends ExampleInterface){'已被内部库调用。我需要确保如果Clazz在编译时没有实现'ExampleInterface',我可以强制它在运行时执行此操作。 – user3144349