【发布时间】:2018-11-06 20:58:06
【问题描述】:
我目前在使用反射将现有 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});
那么如何通过反射访问抽象接口方法呢?
【问题讨论】:
-
使用来自 java.lang.reflect 的类 Method 的 method.invoke()。例如类 clazz = Something.class;方法[] 方法 = clazz.getDeclaredMethods(); for(方法方法:方法){ System.out.println(method.invoke()); }
-
要执行的方法必须是具体的,而不是抽象的。这意味着您需要给它一个具体类的实例,该实例提供抽象方法的实现。也许您需要创建一个代理...?否则,您期望的行为是什么?
-
@gaurav:我使用invoke方法,但是不知道应该使用什么调用目标,因为我无法实例化接口。
-
'显然,这不是从接口访问方法的正确方式':垃圾。抽象接口方法需要一个实例。
-
@ErnestKiwele:收到您的回复后,我已联系工具支持人员,仍在等待回复。
标签: java reflection interface