Dirk Lachowski
Dirk Lachowski

Reputation: 3151

Java type level annotation and private member visibility

I'm trying to externalize the baseurl of a spring @Controller into a static String member of the controller class. If i do so i have to declare the member public - otherwise it will not be visible to the @RequestMapping annotation. I can't understand why - isn't the annotation part of the class?

Can someone explain why i am forced not to use private here?

Invalid:

@Controller
@RequestMapping(PendingApprovalsController.CONTROLLER_URL)
public class PendingApprovalsController {
    private static final String CONTROLLER_URL = "/some/url";
        ...
}

Valid:

@Controller
@RequestMapping(PendingApprovalsController.CONTROLLER_URL)
public class PendingApprovalsController {
    public static final String CONTROLLER_URL = "/some/url";
        ...
}

Upvotes: 5

Views: 2890

Answers (1)

Ernest Friedman-Hill
Ernest Friedman-Hill

Reputation: 81684

An annotation is an ordinary Java class itself. It can't see the members of an annotated class unless they are visible to it, using normal Java rules. Furthermore the existence of annotations may be used by other code at runtime to operate on the members of the annotated class; if those members are not visible, those operations can't be performed.

This page from the JDK documentation package talks about how to define custom annotations, and how to consume annotations applied in code, and it's enlightening in this regard. To define an annotation type, you do something like

public @interface Copyright {
    String value();
}

Your custom annotation is defined as a special kind of Java interface; in user, the JVM supplies a runtime implementation as needed. But the key thing to note is how you use your custom annotation, for example:

Method m = ... // Get a java.lang.reflect.Method object from somewhere
if (m.hasAnnotation(Copyright.class)) ...

Note that here we refer to the class object of the annotation type, demonstrating that an annotation is compiled to a normal Java type.

Upvotes: 5

Related Questions