我正在挖掘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("...");
}
// ...
}
现在的问题是,某些“面向Web”的方法是从父类继承的,而不会在子级中被覆盖。如果我正确理解了getDeclaringClass(),它将在这种情况下返回 parent 类,但我们真正想要的是子类。一些测试似乎证实了这一点 - 如果我覆盖子类中的方法一切都很好,但如果我没有放入覆盖,则抛出异常。
因此,给定一个MethodInvocation对象,有没有办法将其追溯到实例化的“实际”类,而不是声明方法的类?还是需要一些其他方法?最糟糕的情况是,我可以根据需要注释每个方法,而不是注释类。
很抱歉,如果这是一个冗长的问题以便于回答 - 我的Java非常生疏。
答案 0 :(得分:4)
很简单,需要在MethodInvocation而不是getThis().getClass()
上使用getMethod().getDeclaringClass()
:
if(! invoc.getThis().getClass().isAnnotationPresent(Tool.class))
{
throw new BaseException("...");
}
虽然在我的情况下,Guice通过放入一个自动生成的子类(例如,以“$$ EnhancerByGuice ...”结尾的类名)使事情变得复杂。通过使用{{ 1}}:
getSuperclass()
答案 1 :(得分:0)
看起来答案是否定的。我创建了一个简单的测试来检查它:
class Run implements Runnable {
@Override
public void run() {
}
}
class Run2 extends Run{}
Method method = Run2.class.getMethods()[0];
System.out.println(method);
正如我们在调试窗口中看到的那样,方法没有类Run2的任何信息:
我想最好坚持使用其注释的实际方法,而不是实际调用这些方法的类实例。