JAVA 注解

注解的分类:(按照运行机制来分类)

1,源码注解

2,编译时注解(JDK自带注解: Override, Deprecated, Suppvisewarnings)

3,运行时注解 (在运行阶段起作用,可能会运行编译的逻辑,例如 Autowired)


按照来源分类:

1,JDK自带的注解

2,第三方的注解

3,自定义注解


自定义注解的语法:

成员类型是受限制的,只能是JAVA的8个基本类型,String,Class,Annotation,Enumberation。

可以没有成员,没有成员的注解称为标记注解。

public @interface Table {//用关键字@interface,成员以无参无异常的方式声明

	/**
	 * 成员以无参无异常的方式声明
	 * @return
	 */
	String dec();
	
	/**
	 * 只有一个成员时用规定用value(用其它的也不会报错)
	 * @return
	 */
	String value();
	
	/**
	 * 可以用default设置一个默认值
	 * @return
	 */
	int age() default 18;
	
}




元注解:

1,注解的作用域

@Target ()

值:ElementType.Method 方法声明

     ElementType.CONSTRUCTOR 构造方法声明

     ElementType.FIELD 字段声明

     ElementType.LOCAL_VARIABLE 局部变量声明

     ElementType.PACKAGE 包声明

ElementType.PARAMETER 参数声明

  ElementType.TYPE 类,接口声明


2,注解的生命周期

@Retention()

值:RetentionPolicy.SOURCE 只在源码中显示,编译时会丢弃

RetentionPolicy.CLASS 编译时会记录到CLASS中,

RetentionPolicy.RUNTIME 运行时存在,可以通过反射来读取


3,允许被子类继承

@Inherited


4,生成JAVADOC时会包含注解

@Documented


注解的使用方法:

@<注解名>(<成员名1>=<成员值1>,<成员名2>=<成员值2>,......)

eg:


@Desc(desc="hello", name="tom", age=18)

解析注解:

概念:通过反射获取类、函数或成员上的运行时(生命周期为RUNTIME)注解信息,从而实现动态控制程序运行的逻辑


这是一个拼接sql的函数


public static String f(User user){
		StringBuffer sb = new StringBuffer();
		
		//获取类
		Class c = user.getClass();
		
		//判断类上是否有注解Table
		boolean tExist = c.isAnnotationPresent(Table.class);
		if(!tExist){
			return null;
		}
		
		Table t = (Table) c.getAnnotation(Table.class);
		
		//获取注解成员值
		sb.append("select * from ").append(t.value()).append(" where 1 = 1 ");
		
		//获取类的成员
		Field[] fArray = c.getDeclaredFields();
		
		//遍历成员
		for (Field field : fArray) {
			
			boolean fExist = field.isAnnotationPresent(Column.class);
			
			if(!fExist){
				continue;
			}
			
			//获取注解实例
			Column col = field.getAnnotation(Column.class);
			
			//获取注解成员值
			String columnName = col.value();
			
			String fieldName = field.getName();
			
			//获取类中成员的get方法名
			String methodName = "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1, fieldName.length());
			
			Method m;
			Object columnValue;
			try {
				m = c.getMethod(methodName);
				//执行方法,获取类中的成员值
				columnValue = m.invoke(user);
				
				if(columnValue == null){
					continue;
				}
				
				sb.append(" and ").append(columnName).append(" = ");
				if(columnValue instanceof String){
					sb.append("'");
				}
				sb.append(columnValue);
				if(columnValue instanceof String){
					sb.append("'");
				}
			} catch (NoSuchMethodException | SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
		return sb.toString();
	}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值