Wie erzwinge ich eine Java-Unterklasse eine Annotation zu definieren?
-
01-07-2019 - |
Frage
Wenn eine Klasse eine Anmerkung definiert, ist es irgendwie möglich, seine Unterklasse zu zwingen, die gleiche Anmerkung zu definieren?
Zum Beispiel haben wir ein einfache Klasse / Unterklasse-Paar, das den @Author @interface.
teilen
Was würde Ich mag zu tun, jede weitere Unterklasse zwingen, die gleiche @Author
Anmerkung, verhindert eine RuntimeException
irgendwo auf dem Weg zu definieren.
TestClass.java:
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@interface Author { String name(); }
@Author( name = "foo" )
public abstract class TestClass
{
public static String getInfo( Class<? extends TestClass> c )
{
return c.getAnnotation( Author.class ).name();
}
public static void main( String[] args )
{
System.out.println( "The test class was written by "
+ getInfo( TestClass.class ) );
System.out.println( "The test subclass was written by "
+ getInfo( TestSubClass.class ) );
}
}
TestSubClass.java:
@Author( name = "bar" )
public abstract class TestSubClass extends TestClass {}
Ich weiß, ich kann alle Anmerkungen zur Laufzeit aufzählen und für den fehlenden @Author
überprüfen, aber ich würde die wirklich gerne bei der Kompilierung tun, wenn möglich.
Lösung
Sie können das tun, mit JSR 269, bei der Kompilierung. Siehe: http://today.java.net/pub/a/today/2006/06/29/validate-java-ee-annotations-with-annotation-processors.html#pluggable- Annotation-Verarbeitung-api
Andere Tipps
Ich bin ziemlich sicher, dass dies nicht möglich ist, bei der Kompilierung zu tun.
Dies ist jedoch offensichtlich, dass die Aufgabe für eine „Einheit“ -Test. Wenn Sie Konventionen wie diese haben, die Sie durchgesetzt würden, aber die schwierig oder unmöglich sein, können mit dem Compiler zu überprüfen, „Einheit“ -Tests ist eine einfache Möglichkeit, um sie zu überprüfen.
Eine andere Möglichkeit ist eine benutzerdefinierte Regel in einem statischen Analysegerät zu implementieren. Es gibt viele Optionen auch hier.
(Ich habe Einheit in Schrecken Anführungszeichen, da dies wirklich ein Test der Konventionen ist, anstatt eine bestimmte Einheit. Aber es sollte mit dem Gerät-Tests läuft zusammen).
Sie können eine Annotation (z @EnforceAuthor) mit @Inherited machen auf den übergeordneten Klasse und Verwendung Compiler Anmerkungen (seit Java 1.6) bei der Kompilierung, um aufzuholen. Dann haben Sie einen Verweis auf die Unterklasse und können prüfen, ob eine andere Anmerkung (z @Author)) fehlt. Dies würde es ermöglichen mit einer Fehlermeldung abbrechen kompilieren.