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

标签 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("...");
    }

    // ...
}

现在的问题是一些“面向网络”的方法是从父类继承的,而没有在子类中被覆盖。如果我正确理解 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/

相关文章:

java - Android Java 倒计时然后做某事

java - 在 JAVA 中使用 XPath 解析具有不同命名空间的 xml

java - 如何在 Java 中生成随机 BigInteger 值?

c# - GetType() 和 GetTypes() 等反射 API 的性能如何?

java - 如何获取对象构造函数的参数名称(反射)?

c# - 访问 IEnumerable 的属性

javascript - 替换 wicket 的 ajax js 文件后,Wicket 6.19 导入顺序发生变化

用于教学的Java开源项目

reflection - 将 reflect.Value 从字符串转换为 int

java - 检查类类型 (.class) 是否等于其他类类型