java annotation注解进修,自定义注解   
               添加时间:2013-7-30 点击量: 
 
              1、Annotation(注解)介绍
Annotation(注解)是JDK5.0及今后版本引入的。它可以用于创建文档,跟踪代码中的依附性,甚至履行根蒂根基编译时搜检。注解是以@注解名在代码中存在的,按照注解参数的个数,我们可以将注解分为:标识表记标帜注解、单值注解、完全注解三类。它们都不会直接影响到法度的语义,只是作为注解(标识)存在,我们可以经由过程反射机制编程实现对这些元数据(用来描述数据的数据)的接见。别的,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件中呈现。
在javaEE经典的SSH框架中(Strtus,Spring,hibernate),都可以用过应用注解来削减设备,进步体系的灵活性,所以,进修注解,是很有须要的一件事。
2、Annotation进修
元注解
元注解也就是注解的注解,Java中供给了四种元注解,专门负责注解其他的注解,分别如下:
@Retention元注解,默示须要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包含:
RetentionPolicy.SOURCE: 逗留在java源文件,编译器被丢掉
RetentionPolicy.CLASS:逗留在class文件中,但会被VM丢弃(默认)
RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保存注解,是以可以经由过程反射机制读取注解的信息
@Target说了然Annotation所润饰的对象局限:Annotation可被用于 packages、types(类、接口、列举、Annotation类型)、类型成员(办法、机关办法、成员变量、列举值)、办法参数和本地变量(如轮回变量、catch参数)。在Annotation类型的声明中应用了target可加倍明晰其润饰的目标。
ElementType.CTRUCTOR: 机关器声明
ElementType.FIELD: 成员变量、对象、属性(包含enum实例)
ElementType.LOCAL_VARIABLE: 局部变量声明
ElementType.METHOD: 办法声明
ElementType.PACKAGE: 包声明
ElementType.PARAMETER: 参数声明
ElementType.TYPE: 类、接口(包含注解类型)或enum声明
@Documented将注解包含在JavaDoc中
@Inheried容许子类持续父类中的注解
3、自定义注解
下面写一个自定义的注解,不评论辩论他的实用性,只是进修注解的写法以及应用
一个列举,为注解做数据筹办:
package timeng.annotation;
		
/
		
  
		
  〈正则表达式规矩列举〉
  @author
					timeng
			
 /
		
public
				enum RegexRule {
				
			/
		
      email正則表達式規則
     /
		
			EMAIL(^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}¥),
					
			/
		
      數字正則表達式規則
     /
		
			NUMBER(^[0-9]¥);
					
    
 
			public String value; 
					
    
 
    RegexRule(String value) { 
		
			this.value = value; 
					
    } 
		
}
	
定义注解格局:public @interface 注解名 {定义体}
注解参数的可支撑数据类型:
1.所有根蒂根基数据类型(int,float,boolean,byte,double,char,long,short)
2.String类型
3.Class类型
4.enum类型
5.Annotation类型
6.以上所有类型的数组
注解:
package timeng.annotation;
		
 
/
		
  
		
  〈正则表达式注解〉
  @author
					timeng
			
 /
		
@Documented
		
@Retention(RetentionPolicy.RUNTIME)
				
@Target(ElementType.METHOD)
				
@Inherited
		
public
				@interface
						Regex {
						
			/
		
      正则表达式
      @return
		
     /
		
    RegexRule regexRule() default RegexRule.NUMBER;
					
}
注解解析类,很是关键
package timeng.annotationparse;
		
 
/
		
  
		
  〈注解解析通用類〉
 
		
  @author
					timeng
			
 /
		
public
				class AnnotationParseUtil {
				
			public
					void parseMethod(Class clazz) throws IllegalArgumentException, IllegalAccessException,
							
            InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException {
		
        Object obj = clazz.getConstructor(new Class[] {}).newInstance(new Object[] {});
			
			for (Method method : clazz.getDeclaredMethods()) {
			
			DateFormat df = method.getAnnotation(DateFormat.class);
							
            String name = ;
			
			if (df != null) {
					
                name = df.dateType().value;
			
                method.invoke(obj, name);
		
            }
		
        }
		
    }
		
			/
		
      
		
      功能描述: <br>
			
      〈调用指定类的指定办法,传参〉
     /
		
			public
					void parseMethod(Object proxy, Method method, Object[] args) throws IllegalArgumentException,
							
            IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException,
		
            InstantiationException {
		
			// Object obj = clazz.getConstructor(new Class[] {}).newInstance(new Object[] {});
		
			Regex df = method.getAnnotation(Regex.class);
							
        String name = ;
			
			if (df != null) {
					
            name = df.regexRule().value;
			
            method.invoke(proxy, args[0], name);
		
        }
		
    }
		
}
		
 
应用注解的类
package timeng.test;
		
 
/
		
  
		
  〈用例〉
  
		
  @author
					timeng
			
 /
		
public
				class UseCase {
				
			/
		
      @DateFormat(dateType=DateType.DateOnly) public void formatDate(Date date,String type){ System.out.println(date);
		
      }
		
     /
		
			@Regex(regexRule = RegexRule.EMAIL)
					
			public
					void regexEmail(String unCheckedString, String regexRule) {
					
			boolean rs = Pattern.compile(regexRule).matcher(unCheckedString).find();
			
			// System.out.println(unCheckedString);
		
			// System.out.println(regexRule);
		
        System.out.println(rs);
			
    }
		
}
		
测试类
package timeng.test;
		
 
/
		
  
		
  〈测试类〉
 
		
  @author
					timeng
			
 /
		
public
				class Test {
				
			public
					static
							void main(String[] args) throws IllegalArgumentException, IllegalAccessException,
									
            InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException {
		
        AnnotationParseUtil parse = new AnnotationParseUtil();
			
			// parse.parseMethod(UseCase.class);
		
        Object[] params = new Object[10];
			
        params[0] = 123@qq.com;
			
        UseCase useCase = new UseCase();
			
        parse.parseMethod(useCase, UseCase.class.getDeclaredMethods()[0], params);
			
    }
		
}
		
 
运行test类即可看到结果:Test类应用注解,来添加正则表达式的验证规矩,本例验证了一个邮箱格局。
原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#
                     
                  
     
  
 
    
    
1、Annotation(注解)介绍
Annotation(注解)是JDK5.0及今后版本引入的。它可以用于创建文档,跟踪代码中的依附性,甚至履行根蒂根基编译时搜检。注解是以@注解名在代码中存在的,按照注解参数的个数,我们可以将注解分为:标识表记标帜注解、单值注解、完全注解三类。它们都不会直接影响到法度的语义,只是作为注解(标识)存在,我们可以经由过程反射机制编程实现对这些元数据(用来描述数据的数据)的接见。别的,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件中呈现。
在javaEE经典的SSH框架中(Strtus,Spring,hibernate),都可以用过应用注解来削减设备,进步体系的灵活性,所以,进修注解,是很有须要的一件事。
2、Annotation进修
元注解
元注解也就是注解的注解,Java中供给了四种元注解,专门负责注解其他的注解,分别如下:
@Retention元注解,默示须要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包含:
RetentionPolicy.SOURCE: 逗留在java源文件,编译器被丢掉
RetentionPolicy.CLASS:逗留在class文件中,但会被VM丢弃(默认)
RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保存注解,是以可以经由过程反射机制读取注解的信息
@Target说了然Annotation所润饰的对象局限:Annotation可被用于 packages、types(类、接口、列举、Annotation类型)、类型成员(办法、机关办法、成员变量、列举值)、办法参数和本地变量(如轮回变量、catch参数)。在Annotation类型的声明中应用了target可加倍明晰其润饰的目标。
ElementType.CTRUCTOR: 机关器声明
ElementType.FIELD: 成员变量、对象、属性(包含enum实例)
ElementType.LOCAL_VARIABLE: 局部变量声明
ElementType.METHOD: 办法声明
ElementType.PACKAGE: 包声明
ElementType.PARAMETER: 参数声明
ElementType.TYPE: 类、接口(包含注解类型)或enum声明
@Documented将注解包含在JavaDoc中
@Inheried容许子类持续父类中的注解
3、自定义注解
下面写一个自定义的注解,不评论辩论他的实用性,只是进修注解的写法以及应用
一个列举,为注解做数据筹办:
package timeng.annotation;
		
/
		
  
		
〈正则表达式规矩列举〉
  @author
					timeng
			
 /
		
public
				enum RegexRule {
				
			/
		
email正則表達式規則
     /
		
			EMAIL(^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}¥),
					
			/
		
數字正則表達式規則
     /
		
			NUMBER(^[0-9]¥);
					
    
 
			public String value; 
					
    
 
    RegexRule(String value) { 
		
			this.value = value; 
					
    } 
		
}
	
定义注解格局:public @interface 注解名 {定义体}
注解参数的可支撑数据类型:
1.所有根蒂根基数据类型(int,float,boolean,byte,double,char,long,short)
2.String类型
3.Class类型
4.enum类型
5.Annotation类型
6.以上所有类型的数组
注解:
package timeng.annotation;
		
 
/
		
  
		
〈正则表达式注解〉
  @author
					timeng
			
 /
		
@Documented
		
@Retention(RetentionPolicy.RUNTIME)
				
@Target(ElementType.METHOD)
				
@Inherited
		
public
				@interface
						Regex {
						
			/
		
正则表达式
      @return
		
     /
		
    RegexRule regexRule() default RegexRule.NUMBER;
					
}
注解解析类,很是关键
package timeng.annotationparse;
		
 
/
		
  
		
〈注解解析通用類〉
 
		
  @author
					timeng
			
 /
		
public
				class AnnotationParseUtil {
				
			public
					void parseMethod(Class clazz) throws IllegalArgumentException, IllegalAccessException,
							
            InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException {
		
        Object obj = clazz.getConstructor(new Class[] {}).newInstance(new Object[] {});
			
			for (Method method : clazz.getDeclaredMethods()) {
			
			DateFormat df = method.getAnnotation(DateFormat.class);
							
            String name = ;
			
			if (df != null) {
					
                name = df.dateType().value;
			
                method.invoke(obj, name);
		
            }
		
        }
		
    }
		
			/
		
      
		
      功能描述: <br>
			
〈调用指定类的指定办法,传参〉
     /
		
			public
					void parseMethod(Object proxy, Method method, Object[] args) throws IllegalArgumentException,
							
            IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException,
		
            InstantiationException {
		
			// Object obj = clazz.getConstructor(new Class[] {}).newInstance(new Object[] {});
		
			Regex df = method.getAnnotation(Regex.class);
							
        String name = ;
			
			if (df != null) {
					
            name = df.regexRule().value;
			
            method.invoke(proxy, args[0], name);
		
        }
		
    }
		
}
		
 
应用注解的类
package timeng.test;
		
 
/
		
  
		
〈用例〉
  
		
  @author
					timeng
			
 /
		
public
				class UseCase {
				
			/
		
      @DateFormat(dateType=DateType.DateOnly) public void formatDate(Date date,String type){ System.out.println(date);
		
      }
		
     /
		
			@Regex(regexRule = RegexRule.EMAIL)
					
			public
					void regexEmail(String unCheckedString, String regexRule) {
					
			boolean rs = Pattern.compile(regexRule).matcher(unCheckedString).find();
			
			// System.out.println(unCheckedString);
		
			// System.out.println(regexRule);
		
        System.out.println(rs);
			
    }
		
}
		
测试类
package timeng.test;
		
 
/
		
  
		
〈测试类〉
 
		
  @author
					timeng
			
 /
		
public
				class Test {
				
			public
					static
							void main(String[] args) throws IllegalArgumentException, IllegalAccessException,
									
            InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException {
		
        AnnotationParseUtil parse = new AnnotationParseUtil();
			
			// parse.parseMethod(UseCase.class);
		
        Object[] params = new Object[10];
			
        params[0] = 123@qq.com;
			
        UseCase useCase = new UseCase();
			
        parse.parseMethod(useCase, UseCase.class.getDeclaredMethods()[0], params);
			
    }
		
}
		
 
运行test类即可看到结果:Test类应用注解,来添加正则表达式的验证规矩,本例验证了一个邮箱格局。
原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#



