Java反射:在没有实例化的情况下调用抽象接口方法

时间:2018-05-28 09:44:03

标签: java reflection interface

我目前正面临使用Reflection将现有Piketec TPT Java API(http://javadoc.jenkins.io/plugin/piketec-tpt/com/piketec/tpt/api/package-summary.html)集成到Java项目中的问题。

TPT Api提供了一个名为“TptApi”的接口,它包含几个抽象方法,用于访问TPT项目。

我已经集成了其他API,例如Dox4j-API,其中一个类实例被用作调用目标。显然,这不是从接口访问方法的正确方法。

我的目标是从TptApi界面(http://javadoc.jenkins.io/plugin/piketec-tpt/com/piketec/tpt/api/TptApi.html#openProject-java.io.File-)访问方法“OpenResult openProject(File f)”。

我的代码:

ClassLoader cl = new URLClassLoader(...);
Map c = new HashMap();

File file = new File("test.prj");

c.put("TptApi", cl.loadClass("com.piketec.tpt.api.TptApi"));
c.put("OpenResult", cl.loadClass("com.piketec.tpt.api.OpenResult"));

//The way I did it with 'normal' classes, not applicable with the interface:
//Object target = ((Class) c.get("TptApi")).newInstance();

OpenResult or = (OpenResult)((Class) c.get("TptApi")).getMethod("openProject", new Class[]{File.class}).invoke(target, new Object[]{_file});

那么如何通过Reflection访问抽象接口方法?

2 个答案:

答案 0 :(得分:0)

我只是偶然发现了这个问题,所以即使它有点过时,也让我回答。我在您的评论中读到,您假定您不需要TPT工具本身即可使用该API。那是完全错误的。 API只是通过RMI与开放的TPT实例进行通信的一种方式。要连接到TPT,TPT实例必须已启用RMI,并且您必须知道可配置的端口和绑定名称。您可以在“ TPT API”下的“首选项”中执行此操作,也可以通过使用命令行参数“ --apiPort”和“ --apiBindingName”启动TPT。现在,您可以使用以下两行代码来获取TptApi实例:

2*to_categorical(labels)-1

答案 1 :(得分:0)

我的第一篇文章没有假定使用API​​不需要TPT。确实是。关于如何在TPT中启用API的方法已有详细记录,您发布的两行代码也是可以的。我描述的问题是使用Java反射来访问API。对于其他API,我可以使用“ newInstance”来访问该工具。使用TPT,相应的API对象是接口而不是类,因此无法实例化它。因此,我想知道如何通过反射来访问此特定的API。