您的位置:首页 > 编程语言 > Java开发

java的注解annotation

2017-02-04 16:25 423 查看
用处

1:生成文档

常用的有@see @param @return 等

:2:跟踪代码依赖性,实现替代配置文件功能。

比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量。以后java的程序开发,最多的也将实现注解配置,具有很大用处;

3:”在编译时进行格式检查。
如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。

api:


1:<T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null:

2:Annotation[] getAnnotations():返回该程序元素上存在的所有注解。

3:boolean isAnnotationPresent(Class<?extends Annotation> annotationClass):判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.:

4:Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

demo1:

/*******************************************************************************
******************************************************************************/
package test.annotation.field;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* 水果颜色注解
*
* @author peida
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {

/**
* 颜色枚举
*/
public enum Color {
BULE, RED, GREEN
};

/**
* 颜色属性
*
* @return
*/
Color fruitColor() default Color.GREEN;

}

/*******************************************************************************
******************************************************************************/
package test.annotation.field;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* 水果名称注解
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {

String value() default "";
}

/*******************************************************************************
******************************************************************************/
package test.annotation.field;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* 水果供应者注解
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {

/**
* 供应商编号
*
* @return
*/
public int id() default -1;

/**
* 供应商名称
*
* @return
*/
public String name() default "";

/**
* 供应商地址
*
* @return
*/
public String address() default "";
}

/*******************************************************************************
******************************************************************************/
package test.annotation.field;

import test.annotation.field.FruitColor.Color;

public class Apple {

@FruitName("Apple")
private String appleName;

@FruitColor(fruitColor = Color.RED)
private String appleColor;

@FruitProvider(id = 1, name = "陕西红富士集团", address = "陕西省西安市延安路89号红富士大厦")
private String appleProvider;

}

/*******************************************************************************
******************************************************************************/
package test.annotation.field;

import java.lang.reflect.Field;

public class AnnotationFiledTest {

/**
* @param args
*/
public static void main(final String[] args) {

getFruitInfo(Apple.class);

}

public static void getFruitInfo(final Class<?> clazz) {

String strFruitName = " 水果名称:";
String strFruitColor = " 水果颜色:";
String strFruitProvicer = "供应商信息:";

final Field[] fields = clazz.getDeclaredFields();

for (final Field field : fields) {
if (field.isAnnotationPresent(FruitName.class)) {
final FruitName fruitName = field.getAnnotation(FruitName.class);
strFruitName = strFruitName + fruitName.value();
System.out.println(strFruitName);
} else if (field.isAnnotationPresent(FruitColor.class)) {
final FruitColor fruitColor = field.getAnnotation(FruitColor.class);
strFruitColor = strFruitColor + fruitColor.fruitColor().toString();
System.out.println(strFruitColor);
} else if (field.isAnnotationPresent(FruitProvider.class)) {
final FruitProvider fruitProvider = field.getAnnotation(FruitProvider.class);
strFruitProvicer = strFruitProvicer + fruitProvider.id() + ";" + fruitProvider.name() + ";" + fruitProvider.address();
System.out.println(strFruitProvicer);
}
}
}

}


 水果名称:Apple

 水果颜色:RED

供应商信息:1;陕西红富士集团;陕西省西安市延安路89号红富士大厦

demo2:

/*******************************************************************************
******************************************************************************/
package test.annotation.method;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* 定义一个注解
*/
@Target(ElementType.METHOD)
// 这是一个对方法的注解,还可以是包、类、变量等很多东西
@Retention(RetentionPolicy.RUNTIME)
// 保留时间,一般注解就是为了框架开发时代替配置文件使用,JVM运行时用反射取参数处理,所以一般都为RUNTIME类型
@Documented
// 用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化
public @interface OneAnnotation {

// 定义注解的参数,类型可以为基本类型以及String、Class、enum、数组等,default为默认值
String parameter1() default "";

int parameter2() default -1;
}

/*******************************************************************************
******************************************************************************/
package test.annotation.method;

/**
* 一个用到了自定义的注解的类
*/
public class OneClass {

@OneAnnotation(parameter1 = "YES", parameter2 = 10000)
public void oneMethod() {
}
}

/*******************************************************************************
******************************************************************************/
package test.annotation.method;

import java.lang.reflect.Method;

public class AnnotationMethodTest {

public static void main(final String[] args) throws Exception {
// 提取到被注解的方法Method,这里用到了反射的知识
final Method method = Class.forName("test.annotation.method.OneClass").getDeclaredMethod("oneMethod");
// 从Method方法中通过方法getAnnotation获得我们设置的注解
final OneAnnotation oneAnnotation = method.getAnnotation(OneAnnotation.class);

// 得到注解的俩参数
System.out.println("para1: " + oneAnnotation.parameter1());
System.out.println("para2: " + oneAnnotation.parameter2());
}
}


para1: YES

para2: 10000

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  annotation 注解