簡體   English   中英

獲取用於MethodInvocation而不是聲明類的實際類

[英]Getting the actual class used for a MethodInvocation rather than the declaring class

我正在挖掘一個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(),它將在這種情況下返回類,但我們真正想要的是子類。 一些測試似乎證實了這一點 - 如果我覆蓋子類中的方法一切都很好,但如果我沒有放入覆蓋,則拋出異常。

那么,給定一個MethodInvocation對象,有沒有辦法將它追溯到實例化的“實際”類,而不是聲明方法的類? 還是需要一些其他方法? 最糟糕的情況是,我可以根據需要注釋每個方法,而不是注釋類。

對不起,如果這是一個冗長的問題,一個簡單的答案 - 我的Java非常生疏。

很簡單,需要在MethodInvocation上使用getThis().getClass()而不是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("...");
    }

看起來答案是否定的。我創建了簡單的測試來檢查它:

    class Run implements Runnable {
        @Override
        public void run() {
        }
    }
    class Run2 extends Run{}
    Method method = Run2.class.getMethods()[0];
    System.out.println(method);

正如我們在調試窗口中看到的那樣,方法沒有Run2類的任何信息:

調試窗口中的方法

我想最好堅持使用其注釋的實際方法,而不是在調用這些方法的實際類實例上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM