获取用于MethodInvocation而不是声明类的实际类

时间:2012-11-15 21:06:20

标签: java reflection

我正在挖掘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非常生疏。

2 个答案:

答案 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的任何信息:

Method in debug window

我想最好坚持使用其注释的实际方法,而不是实际调用这些方法的类实例。