Any reason why we require if (!(getClass().getSuperclass() == AnnotationLiteral.class)) { throw new RuntimeException( "Not a direct subclass of AnnotationLiteral"); } this stops me using annotation literals as an anonymous inner class AFACIT (as you can't use implement when defining one).