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

Java反射:无需实例化即可调用抽象接口方法,java,reflection,interface,Java,Reflection,Interface,我目前面临着通过使用反射在Java项目中集成现有Piketec TPT Java API()的问题 TptApi提供了一个名为“TptApi”的接口,其中包含几个用于访问TPT项目的抽象方法 我已经集成了其他API,比如dox4japi,其中类实例被用作调用目标。显然,这不是从接口访问方法的正确方法 我的目标是从TptApi接口()访问方法“OpenResult openProject(File f)” 我的代码: ClassLoader cl = new URLClassLoader(...)

我目前面临着通过使用反射在Java项目中集成现有Piketec TPT Java API()的问题

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

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

我的目标是从TptApi接口()访问方法“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});

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

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

Registry registry = LocateRegistry.getRegistry(HOST, PORT); // get Server/RMI-Registry
TptApi remoteApi = (TptApi)registry.lookup(BINDING_NAME); // get TPT-API

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

使用java.lang.reflect中类方法的method.invoke()。e、 g.Class clazz=Something.Class;方法[]methods=clazz.getDeclaredMethods();对于(Method:methods){System.out.println(Method.invoke());}要执行的方法必须是具体的,而不是抽象的。这意味着您需要给它一个提供抽象方法实现的具体类的实例。也许你需要创建一个代理。。。?否则,您期望该行为是什么?@gaurav:我使用invoke方法,但我不知道应该使用什么调用目标,因为我无法实例化接口。“显然,这不是从接口访问方法的正确方式。”。抽象接口方法需要一个实例。@ErnestKiwele:在您回复后,我已经联系了工具支持人员,我仍在等待答复。