【发布时间】:2013-04-17 22:11:22
【问题描述】:
我需要与大多数人想要处理的完全相反的东西:我有一个带有 className 和 methodName 的 StackTraceElement。由于该方法属于给定类实现的接口,因此我需要一种方法可以询问该方法源自哪个接口。
我可以调用Class.forName(className),也可以调用clazz.getMethod(methodName),但是method.getDeclaringClass()返回的是提到的类的名称而不是它的原始接口。我不想遍历所有类的接口来找到那个特定的方法,这实际上会使性能无效。
--
基本上它是一种传统的广播机制。广播器类包含一个哈希图,其中键是接口,值是具有实现类的列表。广播器实现了相同的接口,因此每个方法都从 hashmap 中检索实现类,遍历它们并在每个实现类上调用相同的方法。
--
很抱歉在这里添加它,但是在评论中添加它有点太长了:
我的解决方案与 Andreas 所指的类似:
StackTraceElement invocationContext = Thread.currentThread().getStackTrace()[2];
Class<T> ifaceClass = null;
Method methodToInvoke = null;
for (Class iface : Class.forName(invocationContext.getClassName()).getInterfaces()) {
try {
methodToInvoke = iface.getMethod(invocationContext.getMethodName(), paramTypes);
ifaceClass = iface;
continue;
} catch (NoSuchMethodException e) {
System.err.println("Something got messed up.");
}
}
使用类似invocationContext 的结构可以制作拦截器,因此发送器只能包含带有空实现主体的注释方法。
【问题讨论】:
-
您是否尝试过
Class.getInterfaces()在您的用例中是否真的对性能至关重要? -
保证一种方法只属于一个接口。
-
安德烈亚斯,您能否添加您的评论作为答案?我最终选择了 Class.getInterfaces(),似乎成功了。
标签: java reflection methods interface