我目前正面临着使用反射将现有的Piketec TPT Java API (http://javadoc.jenkins.io/plugin/piketec-tpt/com/piketec/tpt/api/package-summary.html)集成到Java项目中的问题。
TptApi提供了一个名为"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});那么如何通过反射访问抽象的接口方法呢?
发布于 2018-11-19 20:03:23
我只是偶然发现了这个问题,所以让我来回答它,即使它有点过时。我在您的评论中看到,您认为自己不需要TPT工具本身就可以使用API。这是完全错误的。API只是通过RMI与开放的TPT实例进行通信的一种方式。要连接到TPT,TPT实例必须启用RMI,并且您必须知道可配置的端口和绑定名称。您可以在"TPT API“下的首选项中执行此操作,或者使用命令行参数"--apiPort”和"--apiBindingName“启动TPT。现在,您可以使用以下两行代码获取TptApi实例:
Registry registry = LocateRegistry.getRegistry(HOST, PORT); // get Server/RMI-Registry
TptApi remoteApi = (TptApi)registry.lookup(BINDING_NAME); // get TPT-API发布于 2018-11-20 21:47:50
我最初的帖子并没有假设TPT对于API的使用不是必需的。的确如此。在TPT中启用API的方法有很好的文档记录,您发布的两行代码也是可以的。我描述的问题是使用Java反射访问接口。对于其他API,我可以使用"newInstance“来访问该工具。使用TPT时,相应的API对象是一个接口,而不是一个类,因此无法实例化它。因此,我想知道如何通过反射访问这个特定的API。
https://stackoverflow.com/questions/50563427
复制相似问题