注解

注解

注解即是元数据,就是源代码的元数据.

在Java语法中,使用@符号作为开头,后面紧跟注解名,用作于类,接口,方法,字段之上>例:@Override 复写父类方法注解

Java三大内置注解

@Override ;      表示当前的方法定义将覆盖父类中的方法,如果出现错误,编辑器报错.

@Deprecated; 如果使用次注解,编译器会出现警告信息(标示已过时)

@SuppressWarning();       抑制编译器的警告信息 unchecked表示:执行了未检查的转换

元注解

自定义注解的时候使用的注解.(修饰其他注解的定义)

Java定义的4个元注解

@Targt

该元注解说明了Annotation(注解)所修饰的对象范围.(被描述的注解可以用在什么地方).

取值范围有:

类型                                                           用途

CONSTRUCTOR                                   用于描述构造器

FIELD                                                     用于描述字段

LOCAL_VARIABLE                               用于描述局部变量    

METHOD                                              用于描述方法

PACKAGE                                              用于描述包

PARAMETER                                        用于描述参数

TYPE                                               用于描述类、接口(包括注解类型) 或enum声明

例:(该注解只能在方法中使用)

@Target(ElementType.METHOD)

public @interface myAnnotation{

}

@Retentoin

该元注解定义了Annotation(注解)被保留的时间长短,表示需要在什么级别保存该注释信息,用于描述注解的生命周期(什么范围内有效);指定该注解可以使用反射读取.

取值范围有:

类型                                               说明

SOURCE                    在源代码中有效(仅出现在源代码中,而被编译器丢弃)

CLASS                        在class文件中有效,(被编译在Class文件中) 类加载

RUNTIME                 在运行时有效(编译在Class文件中)

例:

/***

 * 字段注解接口

 */

@Target(value = {ElementType.FIELD})//注解可以被添加在属性上

@Retention(value = RetentionPolicy.RUNTIME)

//注解保存在JVM运行时刻,能够在运行时刻通过反射API来获取到注解的信息

public @interface Column {

    String name();//注解的name属性

}

@Documented

将注解包含在javadoc中,可以使用JavaDoc提取为文档

@Inherited

指定该修饰的注解具有继承性

自定义注解

格式:

public @interface 注解名{

//成员变量:注解中以无参的方法来声明成员变量

返回值类型 方法名();

返回值类型 方法名()  default 默认值;

}

规则:

修饰符中只能是public 或 默认(default)

参数成员只能用基本数据类型和String,Enum,Class,annotations及这些类型的数组

如果只有一个参数成员,最好将名称设为”value”

注解元素必须有确定的值,可以在注解中定义默认值,也可以使用直接时指定,非基本类型的值不可为null,常使用空字符串或0作默认值

在表现一个元素存在或缺失的状态时,定义一下特殊值来表示,如空字符串或负值.

自定义注解的使用:

自定义注解:

import java.lang.annotation.*;

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

    String value();
}

测试实体类

@Table("city")
public class CityEntity {

    @Table("idTable")
    public Integer id;
    @Table("nameTable")
    public String name;

    @Table("getIdMethod")
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

模拟获取类、方法、字段注解信息内容

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

public class SqlUtils {

    public static String getSelectSql(Object obj) throws NoSuchMethodException {
        StringBuilder sb = new StringBuilder();
        sb.append("SELECT * FROM ");
        Class<?> aClass = obj.getClass();
        //判断是否加了注解
        if(aClass.isAnnotationPresent(Table.class)){
            //获取类注解信息
            Table annotation = aClass.getAnnotation(Table.class);
            //调用方法
            sb.append(annotation.value());
        }
        //获取字段注解信息
        Field[] fields = obj.getClass().getFields();
        for (Field field : fields) {
            sb.append("------");
            Table annotation = field.getAnnotation(Table.class);
            sb.append(annotation.value());
        }
        //获取方法注解信息
        Method getId = obj.getClass().getMethod("getId", null);
        Table annotation = getId.getAnnotation(Table.class);
        sb.append("------");
        sb.append(annotation.value());
        return sb.toString();
    }
}

测试结果

public class test {

    public static void main(String args[]) throws NoSuchMethodException {
        CityEntity cityEntity = new CityEntity();
        String selectSql = SqlUtils.getSelectSql(cityEntity);
        System.out.println(selectSql);
    }
}

//打印结果:
SELECT * FROM city------idTable------nameTable------getIdMethod

 

 

posted on 2017-12-21 17:06  听风醉  阅读(258)  评论(0编辑  收藏  举报

导航

因为不可能,所以才值得相信。