亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

查找被注釋處理覆蓋的方法

查找被注釋處理覆蓋的方法

SMILET 2021-12-22 20:14:09
代碼結構假設我們有一個這樣的結構:class A {    @AMethodAnnotation("my-data")    public void myMethod() {    }}@MyClassAnnotationclass B extends A {    @Override    public void myMethod() {    }}我正在努力實現的目標使用注釋處理,我試圖從AMethodAnnotation位于myMethodclass 內部方法上的注釋中提取數據A。類B擴展了這個類并覆蓋了它的方法myMethod。扭曲的是我想要來自方法的數據,AMethodAnnotation如果它在里面的類有 annotation MyClassAnnotation。我正在獲取帶有注釋的類MyClassAnnotation并循環遍歷 ,在enclosedElements那里我可以檢查它是否有Override注釋,但我不確定如何獲取它覆蓋的方法,因為那是AMethodAnnotation我想要的數據所在的位置。ExecutableElement似乎沒有提供方法來獲得這個。for (Element classElement : roundEnv.getElementsAnnotatedWith(MyClassAnnotation.class)) {    // Make sure it's a class    if (classElement.getKind() != ElementKind.CLASS) {        continue;    }    // Loop through methods inside class    for (Element methodElement : classElement.getEnclosedElements()) {        // Make sure the element is a method & has a @Path annotation        if (methodElement.getKind() != ElementKind.METHOD) {            continue;        }        // If method has @Override annotation do stuff    }}問題有沒有辦法獲得對被覆蓋的方法的引用?有一種方法,您獲取Bis的超類A并循環遍歷enclosedElementsin A,然后您必須驗證方法名稱是否相同,以及參數是否相同且順序相同。但是我發現這種方法需要大量檢查,因此我的問題是是否有更好的方法。
查看完整描述

1 回答

?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

我根據評論中發布的鏈接@rmuller 編寫了以下方法。如 Javadoc 和下圖所示,此方法有大量文檔,其中更具可讀性。

http://img1.sycdn.imooc.com//61c316af0001655e06510337.jpg

/**

 * Will find the method which the method <strong>methodElement</strong> is overriding, if any.

 * It does this by recursively traversing up the superclass tree of the

 * <strong>classElement</strong> and checking if there are methods which override the

 * <strong>methodElement</strong>. It will return after it finds the first method with the

 * annotation <strong>annotation</strong>.

 *

 * @param originalClassElement The original class inside which the

 *                             <strong>methodElement</strong> is located.

 * @param classElement         The class which represents the superclass while recursively

 *                             looking up the tree, it should be equal to the

 *                             <strong>originalClassElement</strong> when first calling this

 *                             method.

 * @param methodElement        The method for which should be checked if it's overriding

 *                             anything.

 * @param annotation           The annotation which must be matched before returning the result

 * @return Will return the following, the list is written in order:

 *         <ul>

 *         <li>The method <strong>methodElement</strong> if <strong>methodElement</strong>

 *         already has an annotation of the type <strong>annotation</strong></li>

 *         <li>Null if the method <strong>methodElement</strong> does not have an @Override

 *         annotation</li>

 *         <li>Null if the class <strong>classElement</strong> does not have a superclass</li>

 *         <li>The method element which was found to have the annotation

 *         <strong>annotation</strong></li>

 *         </ul>

 */

public ExecutableElement getMethodOverride(TypeElement originalClassElement,

        TypeElement classElement, ExecutableElement methodElement,

        Class<? extends Annotation> annotation) {


    if (methodElement.getAnnotation(annotation) != null) {

        // The methodElement which was passed has the required annotation already

        return methodElement;

    }


    if (methodElement.getAnnotation(Override.class) == null) {

        // The methodElement which was passed does not have an @Override annotation and is

        // therefore not overriding anything.

        return null;

    }


    if (classElement.getSuperclass().getKind() == TypeKind.NONE) {

        // Class has no superclass

        return null;

    }


    for (Element elem : classElement.getEnclosedElements()) {

        if (elem.getKind() != ElementKind.METHOD) {

            // Not a method

            continue;

        }


        // Check if the method inside the superclass overrids the method inside the original

        // class

        if (this.processingEnv.getElementUtils().overrides(methodElement,

                (ExecutableElement) elem, classElement)) {


            // Recursively go up the tree and check since this method might also override

            // another method

            return getMethodOverride(originalClassElement,

                    this.env.getElementUtils()

                            .getTypeElement(classElement.getSuperclass().toString()),

                    (ExecutableElement) elem, annotation);

        }


    }


    // Recursively go up the tree and check there

    return getMethodOverride(originalClassElement,

            this.env.getElementUtils().getTypeElement(classElement.getSuperclass().toString()),

            methodElement, annotation);

}


查看完整回答
反對 回復 2021-12-22
  • 1 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號