前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java注解讲解与实用示例

java注解讲解与实用示例

作者头像
青山师
发布2023-05-04 19:56:07
1780
发布2023-05-04 19:56:07
举报

java注解使用入门到高级使用

  java从1.5开始给程序员提供了不少语法糖,注解就是其中之一,Thinking in JAVA 第四版调侃说这是迫于来自C#等语言的特性不得不做出的改变。

注解早在J2SE1.5就被引入到Java中,主要提供一种机制,这种机制允许程序员在编写代码的同时可以直接编写元数据。

解释何为注解的最佳方式就是元数据这个词:描述数据自身的数据。注解就是代码的元数据,他们包含了代码自身的信息。

注解可以被用在包,类,方法,变量,参数上。自Java8起,有一种注解几乎可以被放在代码的任何位置,叫做类型注解。我们将会在后面谈到具体用法。

被注解的代码并不会直接被注解影响。这只会向第三系统提供关于自己的信息以用于不同的需求。

注解会被编译至class文件中,而且会在运行时被处理程序提取出来用于业务逻辑。当然,创建在运行时不可用的注解也是可能的,甚至可以创建只在源文件中可用,在编译时不可用的注解。

代码语言:javascript
复制
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;
}
代码语言:javascript
复制
@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());
	}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档