我正在研究 Web 应用程序以解决一些问题。该应用程序使用 Tomcat、Jersey 和 Guice。问题之一发生在用于授权目的的 MethodInterceptor 中。这是方法,修剪到相关部分:
public Object invoke(MethodInvocation invoc) throws Throwable {
// ...
//Check that the annotation actually exists
if(! invoc.getMethod().getDeclaringClass().isAnnotationPresent(Tool.class))
{
throw new BaseException("...");
}
// ...
}
现在的问题是一些“面向网络”的方法是从父类继承的,而没有在子类中被覆盖。如果我正确理解 getDeclaringClass() ,它会在这种情况下返回父类,但我们真正想要的是子类。一些测试似乎证实了这一点——如果我覆盖子类中的方法,一切都很好,但如果我不放入覆盖,则会抛出异常。
那么,给定一个 MethodInvocation 对象,有没有办法将它追溯到实例化的“实际”类,而不是声明方法的类?还是需要其他一些方法?最坏的情况是,我可以根据需要对每个方法进行注释,而不是对类进行注释。
对不起,如果这是一个冗长的问题来简单回答 - 我的 Java 非常生疏。
最佳答案
足够简单,需要使用 getThis().getClass()
在 MethodInvocation 而不是 getMethod().getDeclaringClass()
:
if(! invoc.getThis().getClass().isAnnotationPresent(Tool.class))
{
throw new BaseException("...");
}
尽管在我的例子中,Guice 通过放入一个自动生成的子类(例如,以“$$EnhancerByGuice...”结尾的类名)使事情变得有点复杂,这是通过使用
getSuperclass()
在树上移动一个来解决的: if(! invoc.getThis().getClass().getSuperclass().isAnnotationPresent(Tool.class))
{
throw new BaseException("...");
}
关于java - 获取用于 MethodInvocation 的实际类而不是声明类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13406205/