黑马训练营--注解(二)
2013-10-26 10:18
513 查看
元注解有以下几种:
@Target 表示该注解用于什么地方。
@Retention表示要在什么级别保存该注解。
@Documented 将此注解包含在JavaDoc中。
@Inherited 允许子类继承父类中的注解。
Java中内置的注解@Override用于SOURCE级别,@SuppressWarnings用于SOURCE级别,@Deprecated用于RUNTIME级别。指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为
RetentionPolicy.CLASS。
import java.lang.reflect.*;
import java.lang.annotation.*;
public class PasswordUtils{
@UseCase(id=11,description="test1")
public void test1(){}
public void test2(){}
//description的值用默认的值
@UseCase(id=12)
public void test3(){}
@UseCase(id=13,description="private")
private void test4(){};
@UseCase(id=14,description="protected")
protected void test5(){};
@UseCase(id=14,description="default")
void test6(){};
public static void trackUseCases(Class<?> clazz){
//利用反射返回对象的一个数组,这些对象反映此Class对象表示
//的类或接口声明的所有方法,包括公共,保护,默认访问和私有方法,但不包括继承的方法。
Method[] methods = clazz.getDeclaredMethods();
for(Method m : methods){
//如果指定类型的注释存在于此元素上,则返回 true,
//否则返回 false。此方法主要是为了便于访问标记注释而设计的。
if(m.isAnnotationPresent(UseCase.class)){
UseCase uc = m.getAnnotation(UseCase.class);
System.out.println("Method Name:" + m.getName() + " id:" + uc.id()
+ " decription:" + uc.description());
}
}
}
public static void main(String[] args){
trackUseCases(PasswordUtils.class);
}
}
注意:如果注解中只有value一个属性,在写注意元素时,value=可以不用写。
所有的基本类型(int ,float,double等)
String
Class
enum
Annotation
以上类型的数组
如果你使用了其他类型编译器就会报错。
@Target 表示该注解用于什么地方。
@Retention表示要在什么级别保存该注解。
@Documented 将此注解包含在JavaDoc中。
@Inherited 允许子类继承父类中的注解。
Java中内置的注解@Override用于SOURCE级别,@SuppressWarnings用于SOURCE级别,@Deprecated用于RUNTIME级别。指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为
RetentionPolicy.CLASS。
编写注解类型
下面将用来读取PasswordUtils类,利用反射机制读取UseCase注解。import java.lang.reflect.*;
import java.lang.annotation.*;
public class PasswordUtils{
@UseCase(id=11,description="test1")
public void test1(){}
public void test2(){}
//description的值用默认的值
@UseCase(id=12)
public void test3(){}
@UseCase(id=13,description="private")
private void test4(){};
@UseCase(id=14,description="protected")
protected void test5(){};
@UseCase(id=14,description="default")
void test6(){};
public static void trackUseCases(Class<?> clazz){
//利用反射返回对象的一个数组,这些对象反映此Class对象表示
//的类或接口声明的所有方法,包括公共,保护,默认访问和私有方法,但不包括继承的方法。
Method[] methods = clazz.getDeclaredMethods();
for(Method m : methods){
//如果指定类型的注释存在于此元素上,则返回 true,
//否则返回 false。此方法主要是为了便于访问标记注释而设计的。
if(m.isAnnotationPresent(UseCase.class)){
UseCase uc = m.getAnnotation(UseCase.class);
System.out.println("Method Name:" + m.getName() + " id:" + uc.id()
+ " decription:" + uc.description());
}
}
}
public static void main(String[] args){
trackUseCases(PasswordUtils.class);
}
}
注意:如果注解中只有value一个属性,在写注意元素时,value=可以不用写。
注解元素
注解元素可用的类型如下:所有的基本类型(int ,float,double等)
String
Class
enum
Annotation
以上类型的数组
如果你使用了其他类型编译器就会报错。
public @interface MyAnnotation{ String value(); }
enum AlarmPoints{ START1,START2,LOBBY,OFFICE1,OFFICE2; }
import java.lang.annotation.*; //target的参数可以用数组表示 @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface UseCase{ public int id(); public String description() default "no description"; //class类型 Class clazz(); //枚举类型 AlarmPoints alarmPoints() default AlarmPoints.START1; //注解类型 MyAnnotation myAnno() default @MyAnnotation("value"); //数组类型 int[] arrAttr() default {1,2,3}; }
相关文章推荐
- 黑马训练营 -----------------注解
- 黑马训练营--注解(一)
- 黑马训练营——java内存分配
- 黑马训练营 ---------多线程
- 黑马训练营-------------String StringBuffer StringBuilder
- 黑马训练营预习视频之学习日记(四)
- 黑马训练营--多线程
- 黑马训练营--IO流
- 黑马训练营java学习笔记:数组
- Java网络学习和笔记——黑马训练营
- 黑马训练营-学习笔记----Java基础
- 黑马训练营 ------------- 模板设计模式
- 黑马训练营---block
- 黑马训练营--反射
- 黑马训练营
- 黑马训练营-SQL语法
- 黑马训练营-学习笔记----面向对象
- 黑马训练营-方法和参数的介绍
- 黑马训练营java学习笔记:反射
- Java字节流和字符流学习和笔记——黑马训练营