java注解讲解与实用示例
2016-06-28 20:15
363 查看
java注解使用入门到高级使用
java从1.5开始给程序员提供了不少语法糖,注解就是其中之一,Thinking in JAVA 第四版调侃说这是迫于来自C#等语言的特性不得不做出的改变。
注解早在J2SE1.5就被引入到Java中,主要提供一种机制,这种机制允许程序员在编写代码的同时可以直接编写元数据。
解释何为注解的最佳方式就是元数据这个词:描述数据自身的数据。注解就是代码的元数据,他们包含了代码自身的信息。
注解可以被用在包,类,方法,变量,参数上。自Java8起,有一种注解几乎可以被放在代码的任何位置,叫做类型注解。我们将会在后面谈到具体用法。
被注解的代码并不会直接被注解影响。这只会向第三系统提供关于自己的信息以用于不同的需求。
注解会被编译至class文件中,而且会在运行时被处理程序提取出来用于业务逻辑。当然,创建在运行时不可用的注解也是可能的,甚至可以创建只在源文件中可用,在编译时不可用的注解。
java从1.5开始给程序员提供了不少语法糖,注解就是其中之一,Thinking in JAVA 第四版调侃说这是迫于来自C#等语言的特性不得不做出的改变。
注解早在J2SE1.5就被引入到Java中,主要提供一种机制,这种机制允许程序员在编写代码的同时可以直接编写元数据。
解释何为注解的最佳方式就是元数据这个词:描述数据自身的数据。注解就是代码的元数据,他们包含了代码自身的信息。
注解可以被用在包,类,方法,变量,参数上。自Java8起,有一种注解几乎可以被放在代码的任何位置,叫做类型注解。我们将会在后面谈到具体用法。
被注解的代码并不会直接被注解影响。这只会向第三系统提供关于自己的信息以用于不同的需求。
注解会被编译至class文件中,而且会在运行时被处理程序提取出来用于业务逻辑。当然,创建在运行时不可用的注解也是可能的,甚至可以创建只在源文件中可用,在编译时不可用的注解。
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(value = ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Anno1 { //注解的变量,并且指定默认属性值 boolean beNull() default false; int minVal() default 0; int maxVal() default Integer.MAX_VALUE; }
@Getter @Setter public class AnnotationTest extends BaseLogger implements Serializable { private static final long serialVersionUID = 946475120194720568L; @Anno1(beNull = true) private String name; @Anno1(minVal=18) private Integer age; @SuppressWarnings("unchecked") public <T> T validateAnno(String param, Class<T> clazz) throws Exception{ T test = (T)JSONObject.toBean(JSONObject.fromObject(param), clazz); //AnnotationTest test = new AnnotationTest(); //testNull(test); for (Field f : test.getClass().getDeclaredFields()) { f.setAccessible(true); Anno1 anno1 = f.getAnnotation(Anno1.class); if( null != anno1){ if( f.getType().equals(String.class) ){ if(!anno1.beNull()){ if(null == f.get(test) || "".equals(f.get(test))){ throw new Byron4jEcxeption(f.getName() + " 参数不能为空"); }; } }else if(f.getType().equals(Integer.class)){ if(f.get(test) == null){ throw new Byron4jEcxeption(f.getName() + " 参数不能为空"); } Integer val = Integer.valueOf(String.valueOf(f.get(test))); if( val <= anno1.minVal() || val >= anno1.maxVal() ){ throw new Byron4jEcxeption(f.getName() + " 参数应该大于" + anno1.minVal()); } } }else{ String value = String.valueOf(f.get(test)); value = value.trim(); if(f.getType().equals(String.class)){ f.set(test, value); } if( null == value || "".equals(value) || "null".equals(value)){ throw new Byron4jEcxeption(f.getName() + " 参数不能为空"); } } } return test; } @Test public void testAnno(){ String param = "{\"name\":\"\",\"age\":15}"; try { System.out.println(validateAnno(param, AnnotationTest.class)); } catch (Exception e) { log.error(e.getMessage()); e.printStackTrace(); } } @Deprecated public static void testNull(AnnotationTest test) { System.out.println(JSONObject.fromObject(test).toString()); } }
相关文章推荐
- 控制反转
- java基础(九)关键字final/多态/抽象类/关键字abstract/接口
- spring+springMVC+mybatis整合
- 北理工Java实验2.4(文件字符流读入)
- Java的并发问题总结
- Struts2 入门训练1
- Java5种常用排序算法
- javaweb学习总结(五)——Servlet开发(一)
- java日志组件:common-logging和log4j的使用说明
- Spring容器关于继承的应用案例
- Struts一张图
- java和js生成二维码
- Java 拓展之调用其他语言
- Java 拓展之调用其他语言
- Spring AOP实现复杂的日志记录(自定义注解)
- java 调用 .net webservice 示例
- 《Java虚拟机并发编程》学习笔记
- Java带有限制的通配符
- JAVA IO流详解
- JDK,JRE,JVM区别与联系(ZZ)