Fork me on GitHub

java自定义注解

注解和注释区别

注释:对程序中的代码解释说明的信息。它主要是给开发者看的,帮助开发者阅读程序代码。
注解:属于Java代码,主要是在程序运行的时候,进行其他的参数配置的,主要是在程序运行过程中,通过反射技术获取参数。注解是给程序使用的。

注解的定义和使用模板

注解:它是Java中的类。可以由开发者自己定义。编译之后,也会生成对应的class文件。

定义格式:
修饰符 @interface 注解名{
}

使用格式:
@注解名;
例如:junit测试中的 @Test
复写方法中的@Override

自定义注解

注解可以书写的位置

定义的注解,可以书写在类的不同位置:
类上、成员变量上、成员方法、构造方法等位置。
在自定义注解上使用@Target 声明自定义的注解可以出现的位置,具体的位置需要使用JDK中提供的类(ElementType)来指定。

ElementType中提供的静态的成员变量,这些变量表示注解可以存在的位置:
ElementType.CONSTRUCTOR:当前的注解可以书写在构造方法上
ElementType.METHOD:当前的注解可以书写在方法上
ElementType.FIELD:当前的注解可以书写在成员变量(字段)上
ElementType.TYPE:当前的注解可以书写在类或接口上

注解生命周期

由@Retention 声明自己的注解可以存活的时间
具体的存活的时间需要通过RetentionPolicy 中提供的值。
RetentionPolicy.SOURCE:注解只能存在于源代码中,编译之后生成了class文件中就没有注解。
RetentionPolicy.RUNTIME:注解一直存在到程序运行过程中,可以通过反射获取注解信息。
RetentionPolicy.CLASS:注解在编译之后,可以被保存到class文件中,但是当JVM加载这个class文件的时候注解就被丢弃。
一般我们自己定义注解,都是希望在程序运行过程中获取注解中的数据信息,因此我们需要将注解声明为 运行时的注解。

注解中的成员变量

注解定义的变量格式:数据类型 变量名();

基本案例

自定义注解

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.CONSTRUCTOR,ElementType.METHOD , ElementType.FIELD})
public @interface MyAnnotation {
// 定义注解的变量
String name();
int age();
String sex();
}

自定义注解的使用

1
2
3
4
5
6
7
8
9
10
11
12
public class UseAnnotation {
@MyAnnotation(name="zhangsan",age=23,sex="nv")
public UseAnnotation(){

}
@MyAnnotation(name="zhangsan",age=23,sex="nv")
private String name;
@MyAnnotation(name="zhangsan",age=23,sex="nv")
public void show(){

}
}

经典使用案例(mysql连接驱动)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/*
* 自定义注解,封装数据库连接的四个参数
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyDriver {
String driver();
String url();
String user();
String pwd();
}


import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
/*
* 专门负责获取数据库的连接工具类
*/
public class JDBCUtils {

@MyDriver(driver="com.mysql.jdbc.Driver",
url="jdbc:mysql://localhost:3306/estore",user="root",pwd="abc")
public static Connection getConnection() throws Exception{

//获取当前类的class文件
Class clazz = JDBCUtils.class;
Method method = clazz.getMethod("getConnection", null);
//获取当前方法上的注解信息
if( method.isAnnotationPresent(MyDriver.class) ){

MyDriver an = method.getAnnotation(MyDriver.class);
String driver = an.driver();
String url = an.url();
String user = an.user();
String pwd = an.pwd();
//获取数据库的连接,加载驱动,获取连接
Class.forName(driver);
//获取连接
Connection conn = DriverManager.getConnection(url, user, pwd);
return conn;
}
return null;
}
}

public class Test {
public static void main(String[] args) throws Exception {

Connection conn = JDBCUtils.getConnection();
System.out.println(conn);

}
}

本文标题:java自定义注解

文章作者:tang

发布时间:2018年08月27日 - 23:08

最后更新:2018年08月27日 - 23:08

原始链接:https://tgluon.github.io/2018/08/27/注解详解/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------