文章参考自:https://www.cnblogs.com/xdp-gacl/p/3622275.html

学习网站:how2java.cn

一、自定义注解的创建过程

第一步:(元注解)   使用元注解对注解类进行相关约束,如@Target定义作用目标,@Retention定义生命周期,@Inherited等等注解

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

第二步: (添加属性)  为注解添加属性,当使用注解时,为这些注解赋值,并在注解的类型中使用

语法是:  类型   属性名();

public @interface MyAnnotation {
String name();
int id();
boolean isCool();
}
@MyAnnotation(name="Right",id=1,isCool = false)
class MyUse{
//通过反射获得注解中的数据
MyAnnotation ma = MyUse.class.getAnnotation(MyAnnotation.class);
String name = ma.name();
int id = ma.id();
boolean isCool = ma.isCool();
}

第三步:(默认值)  这一步视需要而定,主要是为某些属性在注解时如果没有赋值,就指定默认值

语法:    类型  属性名()  default  默认值;

public @interface MyAnnotation {
String name();
int id();
boolean isCool() default true;
} @MyAnnotation(name="Right",id=1)
class MyUse{
MyAnnotation ma = MyUse.class.getAnnotation(MyAnnotation.class);
String name = ma.name();
int id = ma.id();
boolean isCool = ma.isCool();
}

第四步:(value属性) 如果你只想设置一个value值,或者除了value值外,其他值都有默认值,那么可以省略掉“value=”的部分

public @interface MyAnnotation {
String value();
boolean isCool() default true;
} @MyAnnotation("Right")
class MyUse{
MyAnnotation ma = MyUse.class.getAnnotation(MyAnnotation.class);
String value = ma.value();
boolean isCool = ma.isCool();
}

第五步:(高级属性)  你可以向注解中添加更多种属性,如数组,枚举等

1.数组:

public @interface MyAnnotation {
int[] a() default {1,2,4};
int[] b();
} @MyAnnotation(a={2,3,4},b=2)
class MyUse{
MyAnnotation ma = MyUse.class.getAnnotation(MyAnnotation.class);
int[] a = ma.a();
int[] b = ma.b();
}

2.枚举:

public @interface MyAnnotation {
EumTrafficLamp lamp() default EumTrafficLamp.RED;
} enum EumTrafficLamp{
RED,//红
YELLOW,//黄
GREEN,//绿
} @MyAnnotation(lamp = EumTrafficLamp.GREEN)
class MyUse{
MyAnnotation ma = MyUse.class.getAnnotation(MyAnnotation.class);
EumTrafficLamp lamp = ma.lamp();
}

3.注解类型  :  实际上这个代码是运行不了的,应当将MetaAnnotaion创建一个类文件,再在这里面引用,这里为了好理解所以放在了一起

public @interface MyAnnotation {
MetaAnnotation metadata() default @MetaAnnotation("Wrong")
} @interface MetaAnnotation{
String value();
} @MyAnnotation()
class MyUse{
MyAnnotation ma = MyUse.class.getAnnotation(MyAnnotation.class);
//注意,这里调用metadata()返回的是一个MetaAnnotation对象,再使用对象获取其中的值
MetaAnnotation metadata = ma.metadata();
String value = metadata.value();
}

测试用例:

一般在不使用框架的时候,我们使用JDBC需要自己进行创建连接,定义参数之类的操作,在不使用注解的情况下,会导致如果想要修改连接的数据库,就需要更改代码内容。

代码如下:

public class DBUtil {
static String ip = "127.0.0.1";
static int port = 3306;
static String database = "test";
static String encoding = "UTF-8";
static String loginName = "root";
static String password = "admin"; static{
try{
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} public static Connection getConnection() throws SQLException {
String url = String.format("jdbc:mysql://%s:%d/%s?characterEncoding=%s",ip,port,database,encoding);
return DriverManager.getConnection(url,loginName,password);
} }

而如果我们自定义注解,将需要的信息放入注解当中,就可以动态地更改数据库的连接信息,而不需要修改代码内容

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface JDBCConfig {
String ip();
int port() default 3306;
String database();
String encoding();
String loginName();
String password();
}
@JDBCConfig(ip="127.0.0.1",database = "test",encoding = "UTF-8",loginName = "root",password = "admin")
public class DBUtil {
static{
try{
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} public static Connection getConnection() throws SQLException {
//从JDBCConfig中获取信息
JDBCConfig config = DBUtil.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);
} }

【Java编程思想笔记】注解--自定义注解的更多相关文章

  1. Java编程思想 笔记

    date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...

  2. java编程思想笔记(1)

    java编程思想笔记(1) 一,对象的创建和生命周期 对象的数据位于何处?怎样控制对象的生命周期? 在堆(heap)的内存池中动态地创建对象. java完全采用了动态内存分配方式. 二,垃圾回收器 自 ...

  3. #Java编程思想笔记(一)——static

    Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...

  4. 2.1(java编程思想笔记)位移操作

    java位移操作主要有两种: 有符号位移:有符号位移会保留原有数字正负性,即正数依然是正数,负数依然是负数. 有符号位左移时,低位补0. 有符号右移时:当数字为正数,高位补0.当数字为负时高位补1. ...

  5. 【Java编程思想笔记】注解--元注解

    参考文章:(小白的小小白的白 )https://blog.csdn.net/weixin_42315600/article/details/80630669 https://www.cnblogs.c ...

  6. 【Java编程思想笔记】注解1-简单了解注解

    文章参考:https://www.cnblogs.com/xuningchuanblogs/p/7763225.html https://www.cnblogs.com/xdp-gacl/p/3622 ...

  7. Java编程思想学习(十五) 注解

    注解Annotation又叫元数据,是JDK5中引入的一种以通用格式为程序提供配置信息的方式.使用注解Annotation可以使元数据写在程序源码中,使得代码看起来简洁,同时编译器也提供了对注解Ann ...

  8. Java编程思想笔记

    打好java基础 后续会增加相应基础笔试题 目录如下 1 对象导论2 一切都是对象3 操作符4 控制执行流程5 初始化与清理6 访问控制权限7 复用类8 多态9 接口10 内部类11 持有对象12 通 ...

  9. 7.JAVA编程思想笔记隐藏实施过程

    欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51040237 "进行面向对象的设计时,一项主要的考虑是:怎样将发生变 ...

随机推荐

  1. Android图片选择---MultiImageSelector的使用

    Github地址:https://github.com/lovetuzitong/MultiImageSelector MultiImageSelector主要是图片选择功能. AndroidStud ...

  2. TensorRT&Sample&Python[fc_plugin_caffe_mnist]

    本文是基于TensorRT 5.0.2基础上,关于其内部的fc_plugin_caffe_mnist例子的分析和介绍. 本例子相较于前面例子的不同在于,其还包含cpp代码,且此时依赖项还挺多.该例子展 ...

  3. Auto Layout - BNR

    继续UIImageView - BNR篇. 通过Homepwner TARGETS -> General -> Deployment Info -> Devices中的iPhone改 ...

  4. 一人撸PaaS之“应用”

    [什么是“应用”] 应用,如果按名词理解就是类似于可以使用的功能,比如一个App应用.事实上,一个应用包含了大量的交互功能以丰富我们的日常学习和生活. 我们这里的应用指的是一系列功能的集合,可以理解为 ...

  5. centos 6.8 搭建svn服务器

    1. yum remove subversion #卸载 svn服务 2.下载svn服务器安装包 yum -y install subversion 3.创建SVN版本库 mkdir -p /opt/ ...

  6. 控制结构(3): 状态机(state machine)

    // 上一篇:卫语句(guard clause) // 下一篇:局部化(localization) 基于语言提供的基本控制结构,更好地组织和表达程序,需要良好的控制结构. 前情回顾 上次分析了guar ...

  7. 2 数据分析之Numpy模块(1)

    Numpy Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包.它是我们课程所介绍的其他高级工具的构建基础. 其部分功能如下: ndarray, 一个具有复杂广播能 ...

  8. dubbo 使用zookeeper 出现 Dubbo客户端调用报错NullPointerException

    现在将网上的方法总结一下 方法一:.https://blog.csdn.net/u011294519/article/details/81810631 dubbo-provider.xml:提供者先扫 ...

  9. mysql查看存储过程函数

    查询数据库中的存储过程和函数 select `name` from mysql.proc where db = 'xx' and `type` = 'PROCEDURE'   //存储过程       ...

  10. 2019-04-03 研究EasyWeb有感

    今天从往常睡到11点多才起床的状态中一下子转回9点前起床,起床第一件事就是开始研究这框架 1. 根据这框架的说明,首先搭建IDEA开发环境,下载.破解:当从EasyWeb官网下载了两个框架(一个是前端 ...