首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java反射:无需实例化即可调用抽象接口方法

Java反射:无需实例化即可调用抽象接口方法
EN

Stack Overflow用户
提问于 2018-05-28 17:44:03
回答 2查看 161关注 0票数 0

我目前正面临着使用反射将现有的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)“。

我的代码:

代码语言:javascript
复制
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});

那么如何通过反射访问抽象的接口方法呢?

EN

回答 2

Stack Overflow用户

发布于 2018-11-19 20:03:23

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

代码语言:javascript
复制
Registry registry = LocateRegistry.getRegistry(HOST, PORT); // get Server/RMI-Registry
TptApi remoteApi = (TptApi)registry.lookup(BINDING_NAME); // get TPT-API
票数 0
EN

Stack Overflow用户

发布于 2018-11-20 21:47:50

我最初的帖子并没有假设TPT对于API的使用不是必需的。的确如此。在TPT中启用API的方法有很好的文档记录,您发布的两行代码也是可以的。我描述的问题是使用Java反射访问接口。对于其他API,我可以使用"newInstance“来访问该工具。使用TPT时,相应的API对象是一个接口,而不是一个类,因此无法实例化它。因此,我想知道如何通过反射访问这个特定的API。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50563427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档