我需要做与大多数人想要完成的相反的操作:我有一个StackTraceElement对象,其中包含类名和方法名。由于该方法属于给定类实现的接口,我需要一种方法来询问该方法来自哪个接口。
我可以调用Class.forName(className)和clazz.getMethod(methodName),但是method.getDeclaringClass()将返回所述类的名称,而不是它的原始接口。我不想迭代所有类的接口以查找特定方法,这实际上会使性能失效。
基本上它是一个遗留的广播机制。广播器类包含一个哈希映射,其键为接口,值为实现类列表。广播器实现相同的接口,以便每个方法从哈希映射中检索实现类,遍历它们并在每个实现类上调用相同的方法。
抱歉在此处添加,但它有点长,无法添加到注释中:
我的解决方案类似于安德烈斯所提到的:
使用类似于
我可以调用Class.forName(className)和clazz.getMethod(methodName),但是method.getDeclaringClass()将返回所述类的名称,而不是它的原始接口。我不想迭代所有类的接口以查找特定方法,这实际上会使性能失效。
基本上它是一个遗留的广播机制。广播器类包含一个哈希映射,其键为接口,值为实现类列表。广播器实现相同的接口,以便每个方法从哈希映射中检索实现类,遍历它们并在每个实现类上调用相同的方法。
抱歉在此处添加,但它有点长,无法添加到注释中:
我的解决方案类似于安德烈斯所提到的:
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()
真的很关键吗? - Andreas Fester