Skip to main content

Java Annotation

Annotations on Annotations(Meta Annotation)

J2SE 5.0 provides four annotations in the java.lang.annotation package that are used only when writing annotations:

    @Documented—Whether to put the annotation in Javadocs
    @Retention—When the annotation is needed
    @Target—Places the annotation can go
    @Inherited—Whether subclasses get the annotation

These four annotations are used while creating custom Annotations and are called Meta Annotations.

The Target annotation

The target annotation indicates the targeted elements of a class in which the annotation type will be applicable. It contains the following enumerated types as its value:

     @Target(ElementType.TYPE)—can be applied to any element of a class
     @Target(ElementType.FIELD)—can be applied to a field or property
     @Target(ElementType.METHOD)—can be applied to a method level annotation
     @Target(ElementType.PARAMETER)—can be applied to the parameters of a method
     @Target(ElementType.CONSTRUCTOR)—can be applied to constructors
     @Target(ElementType.LOCAL_VARIABLE)—can be applied to local variables
     @Target(ElementType.ANNOTATION_TYPE)—indicates that the declared type itself is an annotation type

The Retention annotation

The retention annotation indicates where and how long annotations with this type are to be retained. There are three values:

RetentionPolicy.SOURCE—Annotations with this type will be by retained only at the source level and will be ignored by the compiler
RetentionPolicy.CLASS—Annotations with this type will be by retained by the compiler at compile time, but will be ignored by the VM
RetentionPolicy.RUNTIME—Annotations with this type will be retained by the VM so they can be read only at run-time

The Documented annotation

The documented annotation indicates that an annotation with this type should be documented by the javadoc tool.
By default, annotations are not included in javadoc. But if @Documented is used, it then will be processed by javadoc-like tools and the annotation type information will also be included in the generated document.

The Inherited annotation

In general annotations are not inherited by child classes from parent classes.

public @interface MyAnnotation{
    String loggerName();

class Super {
  @Oneway public void foo() {


class Sub extends Super {
  public void foo() {

Above case Sub does not have the MyAnnotation annotation.
If an annotation type has the meta-annotation @Inherited  then an annotation of that type on a class will cause the annotation to be inherited by sub-classes. So, in the example above, if the MyAnnotation type had the @Inherited attribute, then Sub  would have the MyAnnotation annotation.


Popular posts from this blog

Converting Java Map to String

Java Collections framework, String manipulation etc is something that we often encounter in Development process.
For processing collections (like checking null/empty, Intersection, Disjunction) We do have some of the very use full libraries.

Some of the Collection related libraries are Apche Commons Collections and Google  Collections(Guava).

Problem Use Case

This article explains how to convert a Java Map to String(and vice versa) using different libraries and technique.

One way is to use StringBuilder(Or String) and loop though the Map and build the String by applying some sort of separator ( for key:value and entry). Here we have to take care of the null value etc.

Without Any Library
If we want to convert the map to a String with key value separator and also individual entry seperator in the resulting String, we have to write code for that. For a simple Map, we have to iterate though the map, take care of the null values etc. Following is a sample to get String built out from Map C…

Masking Credit Card number in Java

Sometimes we need to mask crucial information like Credit Card Numbers, CVV numbers etc before storing  or logging the information. This example mask Credit Card Number (Except last 4 Digit) from a Text which contains information along with Credit Card Number.

The following example demonstrates how we can easily mask the credit card with Matcher and Pattern Classes. This Sample Code uses Matcher and Pattern.
Pattern Used in this sample is not optimized for Credit Card Numbers, this pattern will get any numerical numbers in the String Content.  Based on the Credit Card Type a more efficient and Strict RegEx can be used to mask the Credit Card.
/**Mask the Credit card number but last four digit value **/   Pattern PATTERN = Pattern.compile("[0-9]+"); String message = content; Matcher matcher = PATTERN.matcher(message); String maskingChar = "*"; StringBuilder finalMask = new StringBuilder(maskingChar); while …

Invoking EJB deployed on a remote machine

Invoking EJB deployed on a remote machineIn case we are calling remote ejb( ejb deployed on remote machines),The JNDI lookup might lookup like,Properties env = new Properties();env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");env.put(Context.PROVIDER_URL, "XX.XXX.XX.XX:1099");env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces"); Context ctx = new InitialContext(env);If we are calling local ejb then we can simply create InitialContext without any parameters.Like,Context ctx = new InitialContext();