3

これが私の問題です...

パッケージ pkg3 に注釈があります。

package pkg3;

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TestAnno {

}

また、パッケージ pkg1 には 2 つのクラスがあり、1 つはパブリック アクセス、もう 1 つはデフォルト アクセスです。

package pkg1;

import pkg3.TestAnno;

class Class1 {

    @TestAnno
    public void test1() { }

    public void test2() { }

}

package pkg1;

import pkg3.TestAnno;

public class Class2 extends Class1 {

    @TestAnno
    public void test3() { }

    public void test4() { }

}

最後に、パッケージ pkg2 にメイン クラスがあります。

package pkg2;

import java.lang.reflect.Method;
import pkg1.Class2;
import pkg3.TestAnno;

public class MainClass {

    public static void main(String[] args) {

        Class2 cls = new Class2();
        for(Method m: cls.getClass().getMethods()) {
            System.out.println(m);
            if (m.getAnnotation(TestAnno.class) != null) {
                System.out.println("  > hass anno");
            }
        }

    }

}

この例を実行すると、@TestAnno が存在する 2 つのメソッド (test1 と test3) があるという情報が表示されると思いますが、test3 は 1 つしか表示されません。奇妙なことに、メソッド test1 と test2 は、宣言されたとおりにリストされています。クラス Class2。

public void pkg1.Class2.test3()
  > hass anno
public void pkg1.Class2.test4()
public void pkg1.Class2.test1()
public void pkg1.Class2.test2()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
... rest methods from java.lang.Object

getMethods が指定されたグラスからパブリック メソッドのみを返すことは知っていますが (それはすべてスーパー クラスです)、しかし... これは私にとって奇妙です。

これを使用して、生成されたクラス (デフォルトのアクセス権を持つ) を実装クラス (パブリックであり、生成されたクラスを拡張している) から分離します。生成されたクラスでパブリック アクセスを使用する必要がありますか (他のユーザーには表示されないようにしたい)、または Class1 から注釈付きのパブリック メソッドを取得する方法はありますか?

4

1 に答える 1