Ist der definierende Klassenladeprogramm einer Annotation auf Klassenebene immer ein übergeordnetes Element des initiierenden Klassenladeprogramms dieser Klasse?

Angenommen, das Folgende:

@SomeAnnotation
public interface Foo {
}

Ich würde gerne wissen, ob es immer so ist, dass entweder der definierende Classloader vonSomeAnnotation ist gleich oder ein Elternteil des einleitenden Klassenladeprogramms vonFoo.

ich habe gelesenJVMS v8 Abschnitt 5.3. aber ich bin nicht sicher, was hier zutrifft. Abschnitt 5.3.4 befasst sich mit Einschränkungen beim Laden, diese scheinen jedoch nicht für Anmerkungen zu gelten.

Die Frage, die ich stelle, ist, weil der Code so ist:

    Class<?> fooClass = //will in some way obtain a reference to class Foo
    fooClass.getAnnotation(SomeAnnotation.class);

schlägt fehl, wenn verschiedene Klassenladeprogramme vorhanden sind. Ich weiß, ich könnte es gebrauchengetAnnotations und suchen Sie im resultierenden Array nach einem Element, dessen Klassenname gleich dem Namen von istSomeAnnotation. Aber ich frage mich, ob das Folgende auch funktionieren wird:

    Class<?> fooClass = //will in some way obtain a reference to class Foo
    fooClass.getAnnotation((Class<? extends Annotation>) fooClass
            .getClassLoader().loadClass(SomeAnnotation.class.getName()));

Antworten auf die Frage(1)

Ihre Antwort auf die Frage