我需要与大多数人想要处理的完全相反的东西:我有一个带有 className 和 methodName 的 StackTraceElement。由于该方法属于给定类实现的接口,因此我需要一种方法可以询问该方法源自哪个接口。
我可以调用Class.forName(className)
,也可以调用clazz.getMethod(methodName)
,但是method.getDeclaringClass()
返回的是提到的类的名称而不是它的原始接口。我不想遍历所有类的接口以找到该特定方法,这实际上会使性能无效。
--
基本上它是一种传统的广播机制。广播器类包含一个哈希图,其中键是接口,值是具有实现类的列表。广播器实现相同的接口,以便每个方法从哈希图中检索实现类,遍历它们并在每个实现类上调用相同的方法。
--
很抱歉在这里添加它,但是在评论中添加它有点太长了:
我的解决方案类似于 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
类似的结构可以制作拦截器,因此发送器只能包含带有空实现主体的注释方法。