Java注解

注解定义

用一个词就可以描述注解,那就是元数据,即一种描述数据的数据。所以,可以说注解就是源代码的元数据。

Annotation是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。它是一种由JSR-175标准选择用来描述元数据的一种工具

注解有什么用?

使用Annotation之前(甚至在使用之后),XML被广泛的应用于描述元数据。XML配置其实就是为了分离代码和配置而引入的,而很多时候,希望使用一些和代码紧耦合的东西,比如想把某个方法声明为服务,那么使用Annotation会更好一些,因为这种情况下需要注解和方法紧密耦合起来。

Annotations仅仅是元数据,和业务逻辑无关

注解分类

按照运行机制分类

  1. 源码注解 :只在源码中存在,编译成.class中不存在
  2. 编译时注解 :在.class文件中也存在
  3. 运行时注解 :在运行阶段还会有逻辑作用的注解

按照来源分

  1. JDK自带注解(比如:@Override,@Deprecated
  2. 第三方注解
  3. 自定义注解

自定义注解

  1. 使用@interface关键字声明注解
  2. 成员以无参无异常的方式声明
  3. 可以指定默认值
  4. 成员是受限的,仅限于基本数据类型和String,Class,Annotation, Enumeration等类型。
  5. 如果注解只有一个成员,成员名只能叫value(),在使用时可以忽略成员名和赋值号
  6. 可以没有成员,没有成员的注解称为标识注解

元注解


package com.weixuan.annotationtest;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @ClassName: Description
 * @Description: 注解的作用域
 * @author 韦轩
 * @date 2015年9月2日 下午6:28:36
 */
@Target({ ElementType.METHOD, ElementType.TYPE })

/**
 * @ClassName: Description
 * @Description: 注解的生命周期
 * @author 韦轩
 * @date 2015年9月2日 下午6:28:54
 */
@Retention(RetentionPolicy.RUNTIME)
/**
 * @ClassName: Description
 * @Description: 继承
 * @author 韦轩
 * @date 2015年9月2日 下午6:29:21
 *
 */
@Inherited
/**
 * 
 * @ClassName: Description
 * @Description: Java doc
 * @author 韦轩
 * @date 2015年9月2日 下午6:29:49
 *
 */
@Documented
public @interface Description {

    String Desc();

    String author();

    int age() default 18;
}

使用自定义注解

@注解名(<成员1>= “”,<成员2>=”“)

@Description(desc="This is a test!",author="weixuan",age=22)
public void test() {

    }

解析注解

通过反射获取类、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。

package com.weixuan.annotationtest;

import java.lang.reflect.Method;

public class Client {

    public static void main(String[] args) throws ClassNotFoundException {
        /**
         * 使用类加载器加载类
         */
        Class c = Class.forName("com.weixuan.annotationtest.TestAnnotation");

        /**
         * 找到类上面的注解
         */
        boolean isExist = c.isAnnotationPresent(Description.class);

        if (isExist) {
            /**
             * 拿到注解实例
             */
            Description desc = (Description) c.getAnnotation(Description.class);
            System.out.println(desc.desc());
            System.out.println(desc.age());
            System.out.println(desc.author());

        }

        /**
         * 拿到方法上的注解
         */

        Method[] methods = c.getMethods();

        for (Method ms : methods) {

            boolean isMExist = ms.isAnnotationPresent(Description.class);

            if (isMExist) {
                Description d = ms.getAnnotation(Description.class);
                System.out.println(d.desc());
            }
        }
    }

}

demo

为一个实体生成相应的SQL

Table.java

package com.weixuan.demo;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Table {

    String value();
}

Column.java

package com.weixuan.demo;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {
    String value();
}

User.java

package com.weixuan.demo;

@Table("user")
public class User {

    @Column("user_ID")
    private Integer userID;

    @Column("user_Name")
    private String userName;

    @Column("nick_Name")
    private String nickName;

    @Column("user_Age")
    private Integer userAge;

    @Column("city")
    private String city;

    @Column("email")
    private String email;

    public Integer getUserID() {
        return userID;
    }

    public void setUserID(Integer userID) {
        this.userID = userID;
    }

    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 Integer getUserAge() {
        return userAge;
    }

    public void setUserAge(Integer userAge) {
        this.userAge = userAge;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public User(Integer userID, String userName, String nickName, Integer userAge, String city, String email) {
        super();
        this.userID = userID;
        this.userName = userName;
        this.nickName = nickName;
        this.userAge = userAge;
        this.city = city;
        this.email = email;
    }

    public User() {
        super();
    }

    @Override
    public String toString() {
        return "User [userID=" + userID + ", userName=" + userName + ", nickName=" + nickName + ", userAge=" + userAge
                + ", city=" + city + ", email=" + email + "]";
    }

}

Test.java

package com.weixuan.demo;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {

    private static String query(User user) {

        StringBuilder stringBuilder = new StringBuilder();

        Class c = user.getClass();

        boolean isExist = c.isAnnotationPresent(Table.class);

        if (!isExist)
            return null;

        Table table = (Table) c.getAnnotation(Table.class);

        //获取表明=名
        String tableName = table.value();

        stringBuilder.append("select * from ").append(tableName).append(" where 1=1");

        // 遍历所有字段

        Field[] fields = c.getDeclaredFields();
        for (Field field : fields) {
            boolean isEt = field.isAnnotationPresent(Column.class);
            if (!isEt)
                continue;
            Column column = field.getAnnotation(Column.class);
            String fieldName = field.getName();
            // 拿到字段对应的值,先拿到get方法
            String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
            Object fieldValue = null;
            try {
                Method method = c.getMethod(getMethodName);
                fieldValue = method.invoke(user);
            } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
                    | InvocationTargetException e) {
                e.printStackTrace();
            }
            if (!(fieldValue == null)) {
                if (fieldValue instanceof String)
                    stringBuilder.append(" and ").append(fieldName).append(" like '").append(fieldValue).append("'");
                else {
                    stringBuilder.append(" and ").append(fieldName).append(" = ").append(fieldValue);
                }
            } 
        }
        return stringBuilder.toString();
    }

    public static void main(String[] args) {
        User user1 = new User();
        user1.setUserID(1);

        User user2 = new User();
        user2.setCity("ChengDu");

        User user3 = new User();
        user3.setEmail("test@test.com");

        String sql1 = query(user1);
        System.out.println("user1 = " + sql1);
        String sql2 = query(user2);
        System.out.println("user2 = " + sql2);
        String sql3 = query(user3);
        System.out.println("user3 = " + sql3);
    }
}

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值