1

Javaでオブジェクトのインスタンスとそのクラスタイプを使用してオブジェクトの「親」クラスを取得することは可能ですか?

これらの 2 つのクラス タイプとアノテーション タイプがあるとします。

public class Foo{

}

public class Bar{

    @TestAnnotation
    public Foo mFoo = new Foo();
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation{

}

のインスタンスを使用してFieldオブジェクトを取得したいのですが、それ以外の場合は、これを使用して注釈を取得しますmFooFoonullTestAnnotation test = field.TestAnnotation(SQLiteID.class);


私が望む最終結果は、のインスタンスがFoo特定の注釈を含む別の型の一部であるかどうかを知ることです

これはかなり無理があるように思われるので、それが可能になるとは思わない。

4

3 に答える 3

4

これは一般的に不可能/実行可能です。

同じオブジェクト インスタンスに多くの名前を付けることができます。つまり、同じオブジェクトを多数の異なる静的フィールド、インスタンス フィールド、パラメーター、ローカル変数 (など) に同時に割り当てることができます。

すべての「ソリューション」には、そのようなすべての変数に対するなんらかの形式の反復が含まれますが、これはほとんど実現不可能であり、そのような一般的な設計は避ける必要があります。縮小されたドメイン (アノテーションなど) を使用しても、同様の問題が残ります。つまり、そのドメインのそのようなルート (特定のアノテーションを持つメンバーを持つオブジェクト インスタンス) をすべて見つける方法は?

于 2013-10-12T04:29:24.460 に答える
2

Foo のインスタンスを使用して mFoo の Field オブジェクトを取得したいと思います。

これは物事を逆行しており、不可能です。

Fieldその型をテストすることでBarを取得し、特定の注釈を取得しようとすることができます

Field[] fields = Bar.class.getDeclaredFields();
for (Field field : fields) {
    if (Foo.class.isAssignableFrom(field.getType())) {
        TestAnnotation testAnnotation = field.getAnnotation(TestAnnotation.class);
        System.out.println(testAnnotation); // might be null, if annotation doesn't exist
    }
}

のインスタンスがある場合は、Fooのインスタンスのフィールド値と比較することもできますBar

于 2013-10-12T04:21:50.920 に答える