java注解——实现原理

Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。 当然它也支持自定义Java标注。

内置注解
  • Override - 检查该方法是否是重载方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
  • Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
  • SuppressWarnings - 指示编译器去忽略注解中声明的警告。

当然啦,我们主要的目的是学习自定义注解

下面给出一个例子,主要是关于我们在连接数据库的自定义注解

package com.annotion;

import java.lang.annotation.*;

/**
 * @Target代表注解可以使用的地方
 * ElementType代表元素类型,它是一个枚举
 * FIELD代表可以用在实例域上。
 *
 * @Retention 其中的RetentionPolicy表示保留策略,它也是一个枚举类型,包含三种策略,(默认是CLASS)
 * ①SOURCE 表示 注解将被编译器丢弃(也就是只能在源代码中存在,编译成class文件后,就没了) (例如我们常用的@Override)
 * ②CLASS 表示 注解将在被编译器在类文件中记录,但在运行时不需要被虚拟机保留.
 * (在编译成.class文件后依然存在,但是在虚拟机中运行的时候就没有了)
 * ③RUNTIME 表示注解将由编译器在类文件中记录,在运行时由虚拟机保留,因此它们可以反射性的读取。
 * (在虚拟机中运行的时候任然存在,但是程序可以通过反射获取这些信息。)
 *
 * @Inherited表示这个注解可以被子类继承
 *
 * @Document表示当执行javadoc的时候,本注解会生成相关文档
 */
@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER,ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface JDBCConfig {

    String ip();
    int port() default 3306;
    String database();
    String encoding();
    String loginName();
    String password();

}

接着通过反射连接我们的数据库

*package com.annotion;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
* @author home-pc
* @create2018 -03 -31 -10:32
*/
@JDBCConfig(ip=”127.0.0.1”,database = “test”,encoding = “UTF-8”,loginName = “root”,password = “admin”)
public class TestAnnotation {
static {
try {
Class.forName(“com.mysql.jdbc.Driver”);
}catch (ClassNotFoundException e){
e.printStackTrace();
}
}

/**
 * 通过反射
 * @return
 * @throws SQLException
 * @throws NoSuchFieldException
 * @throws SecurityException
 */
public static Connection getConnection()throws SQLException,NoSuchFieldException,SecurityException{
    JDBCConfig config = TestAnnotation.class.getAnnotation(JDBCConfig.class);
    String ip = config.ip();
    int port = config.port();
    String database = config.database();
    String encoding = config.encoding();
    String loginName = config.loginName();
    String password = config.password();
    String url = String.format("jdbc:mysql://%s:%d/%s?characterEncoding=%s", ip, port, database, encoding);
    return DriverManager.getConnection(url,loginName,password);
}

public static void main(String[] args)throws NoSuchFieldException,SecurityException,SQLException, NoSuchMethodException {
    Connection connection=getConnection();
    System.out.println(connection);
}

}
*

总结:注解很重要的一点是通过注解把我们注解的内容保留在字节码文件中或者运行的虚拟机中,以便在运行时获得标注的内容。

猜你喜欢

转载自blog.csdn.net/m0_37884977/article/details/79773601