JAVA 注解

来源:互联网 发布:ms logo软件 编辑:程序博客网 时间:2024/05/22 00:03

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

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();//判断类上是否有注解Tableboolean 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 blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return sb.toString();}





0 0
原创粉丝点击