博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java注解详解(注解项目实战)
阅读量:2355 次
发布时间:2019-05-10

本文共 5633 字,大约阅读时间需要 18 分钟。

  • 定义:

    注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

  • 作用分类:

    ①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
    ② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
    ③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】

  • JDK内置系统注解:

@Override 用于修饰此方法覆盖了父类的方法;@Deprecated 用于修饰已经过时的方法;@suppressWarings("deprecation") 用于通知java编译器忽略特定的编译警告。
  • 注解的分类

    1、按照运行机制分为
    源码注解:注解只在源码中存在,编译成.class文件就不存在了
    编译时注解:注解在源码和.class文件中都存在(如:JDK内置系统注解)
    运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解(如:Spring中@Autowried)
    2、按照来源分为
    JDK内置系统注解、元注解、自定义注解、第三方注解

  • 自定义注解:

    1.成员类型是受限的,合法的类型包括原始类型及String,Calss,Anootation,Enumreation
    2.如果注解已有一个成员,则成员名必须取名为Vaue(),在使用的时可以忽略成员名和赋值号(=)
    3.注解类可以没有成员,没有成员的注解称为标识注解

public @interface Description{
//使用@interface关键字注解 String name();//成员以无参无异常方式声明 String author(); int age() default 19;//可以用default为成员变量指定一个默认值 }
  • 元注解
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD})// Target 注解的作用域   CONSTRUCTOR 构造方法声明,FIELD 字段声明,LOCAL_VARIABLE 局部变量声明 ,METHOD 方法声明,PACKAGE 包声明,PARAMETER 参数声明,TYPE 类接口。@Retention(RetentionPolicy.RUNTIME)//Retention 生命周期 SOURCE 只在源码显示,编译时会丢弃,CLASS 编译时会记录到class中,运行时忽略,RUNTIME 运行时存在,可以通过反射读取。@Inherited //Inherited 允许子类继承@Documented //Documented 生成javadoc的时候包含注解

注解项目实战

  • 需求:

    这里写图片描述

  • 自定义注解(Table)

package anotationDemo;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/*** * 数据库表的注解 * @author liaot *  */@Target({ElementType.TYPE}) //设置作用域为类 接口@Retention(RetentionPolicy.RUNTIME) //设置生命周期为运行时public @interface Table {
String value(); //表名}
  • 自定义注解Column
package anotationDemo;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/*** * 自定义注解 ,用来映射字段名 * @author liaot * */@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface Column {
String value();}
  • 自定义与表映射的类
package anotationDemo;/*** * java注解样例   利用注解将此表映射到数据库的表 * @author liaot * */@Table("t_user")public class Filter {
//定义字段属性 @Column("id") private int id; @Column("username") private String username; @Column("nickName") private String nickName; @Column("age") private String age; @Column("city") private String city; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getCity() { return city; } public void setCity(String city) { this.city = city; }}
  • (重点)使用自定义注解生成SQL语句
package anotationDemo;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import javax.management.Query;import com.sun.jndi.url.corbaname.corbanameURLContextFactory;import com.sun.org.apache.xpath.internal.operations.And;/*** * 自定义注解测试类 * @author liaot * */public class Test {
public static void main(String[] args) { Filter f1 = new Filter(); f1.setId(1); //查询id为1的用户 Filter f2 = new Filter(); f1.setUsername("lili"); //查询用户名为lili的用户 Filter f3 = new Filter(); f3.setCity("衡阳,长沙,永州"); //查询地点在这三个城市之间的 String sql1 = query(f1); String sql2 = query(f2); String sql3 = query(f3); System.out.println(sql1); System.out.println(sql2); System.out.println(sql3); } private static String query(Object f) { StringBuilder sql = new StringBuilder(); //获取到class Class c1 = f.getClass(); //获取table的名字 boolean exists = c1.isAnnotationPresent(Table.class); if(!exists) { return null; } Table t = (Table)c1.getAnnotation(Table.class); //定义表名 String tableName = t.value(); sql.append("select * from ").append(tableName).append(" where 1=1 "); //遍历所有的字段 Field[] fields = c1.getDeclaredFields(); for (Field field : fields) { //判断是否存在这个注解 boolean Fexists = field.isAnnotationPresent(Column.class); if(!Fexists) { continue; } //获取注解 Column column = field.getAnnotation(Column.class); String ColumuName = column.value(); //获取字段的值 String fieldName = field.getName(); String getMethodName = "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1); Method method = null; Object ColumuValue = null; try { method = c1.getMethod(getMethodName); ColumuValue = method.invoke(f); } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } //int型不需要加单引号,String型需要加单引号 if(ColumuValue instanceof Integer && (int)ColumuValue != 0){ sql.append("and " + ColumuName + " = " + ColumuValue + " "); }else if(ColumuValue instanceof String){ if( ((String) ColumuValue).contains(",") ){ String[] values = ((String) ColumuValue).split(","); sql.append("and " + ColumuName + " in ("); for(int i=0; i
你可能感兴趣的文章
CSS专家、阿里巴巴前端技术专家大漠:纵览布局演变史
查看>>
source insight代码格式化(Astyle)
查看>>
Makefile常用函数
查看>>
配置Linux异构网络下的ntp时间服务器
查看>>
SVN客户端和服务端安装 详解
查看>>
Android Studio 出现 error: cannot find symbol variable abc_ic_ab_back_mtrl_am_alpha
查看>>
Android AndroidManifest.xml 详解
查看>>
Eclipse修改Format不换行 详解
查看>>
Android导入工程提示 Invalid project description 详解
查看>>
Eclipse 历史纪录 详解
查看>>
Android StrictMode 详解
查看>>
Tomcat的优化
查看>>
Android Studio 出现 gradle DSL method not found: android() 错误
查看>>
Fragment 增加高德地图的 com.amap.api.maps.SupportMapFragment
查看>>
《你的投资机会在哪里》
查看>>
Bridge(桥接)模式
查看>>
生成器模式
查看>>
Android Studio 常用快捷键详解
查看>>
Cornerstone无法上传 .so 文件的问题
查看>>
Objective-C #pragma mark 详解
查看>>