【Java编程思想笔记】注解--自定义注解
文章参考自: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编程思想笔记】注解--自定义注解的更多相关文章
- Java编程思想 笔记
date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...
- java编程思想笔记(1)
java编程思想笔记(1) 一,对象的创建和生命周期 对象的数据位于何处?怎样控制对象的生命周期? 在堆(heap)的内存池中动态地创建对象. java完全采用了动态内存分配方式. 二,垃圾回收器 自 ...
- #Java编程思想笔记(一)——static
Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...
- 2.1(java编程思想笔记)位移操作
java位移操作主要有两种: 有符号位移:有符号位移会保留原有数字正负性,即正数依然是正数,负数依然是负数. 有符号位左移时,低位补0. 有符号右移时:当数字为正数,高位补0.当数字为负时高位补1. ...
- 【Java编程思想笔记】注解--元注解
参考文章:(小白的小小白的白 )https://blog.csdn.net/weixin_42315600/article/details/80630669 https://www.cnblogs.c ...
- 【Java编程思想笔记】注解1-简单了解注解
文章参考:https://www.cnblogs.com/xuningchuanblogs/p/7763225.html https://www.cnblogs.com/xdp-gacl/p/3622 ...
- Java编程思想学习(十五) 注解
注解Annotation又叫元数据,是JDK5中引入的一种以通用格式为程序提供配置信息的方式.使用注解Annotation可以使元数据写在程序源码中,使得代码看起来简洁,同时编译器也提供了对注解Ann ...
- Java编程思想笔记
打好java基础 后续会增加相应基础笔试题 目录如下 1 对象导论2 一切都是对象3 操作符4 控制执行流程5 初始化与清理6 访问控制权限7 复用类8 多态9 接口10 内部类11 持有对象12 通 ...
- 7.JAVA编程思想笔记隐藏实施过程
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51040237 "进行面向对象的设计时,一项主要的考虑是:怎样将发生变 ...
随机推荐
- Win10系统如何在防火墙里开放端口
Win10系统如何在防火墙里开放端口(下面傻瓜式教学) 然后怎么做呢?????? 下一步.下一步.下一步.下一步.下一步.下一步.下一步.下一步.下一步.下一步......... 随便起个名字 KO
- Oracle的RowId和Rownum
本文参照来自:https://www.cnblogs.com/whut-helin/p/8024860.html 由sql select p.*,rowid,rownum from promotion ...
- GIT归纳整理
1. 将repo_a的分支提交到repo_b分支 repo_a:表示原始git库地址:repo_b:表示新增的git库地址. git remote add new_remote repo_b:new_ ...
- Windows技巧
1 修改域名 像Linux的/etc/hosts一样,windows也有一个类似的hosts文件, C:/WINDOWS/system32/drivers/etc/hosts 添加如下域名与IP的映射 ...
- [Oracle]Sqlplus 中使用 new_value
通过再sqlplus 中使用 new_value,可以把从表中查询出来的值,放置到 变量中.然后使用变量时,类似与宏定义一样,就可以像使用表中字段一样方便. 这使得sqlplus 的脚本具备和pl/s ...
- 阿里面试题BIO和NIO数量问题附答案和代码
一.问题 BIO 和 NIO 作为 Server 端,当建立了 10 个连接时,分别产生多少个线程? 答案: 因为传统的 IO 也就是 BIO 是同步线程堵塞的,所以每个连接都要分配一个专用线程来处理 ...
- vue webpack打包
webpack构建流程 从启动webpack构建到输出结果经历了一系列过程,它们是: 解析webpack配置参数,合并从shell传入和webpack.config.js文件里配置的参数,生产最后的配 ...
- Python--day02(编程语言、运行python代码、变量)
day01主要内容回顾 1.进制转换: 二进制: 1111 0101 1010 十六进制 f 5 a 2.内存分布:堆区 和 栈区 外来人只能访问栈区的数据 ...
- Asible第三章:roles--小白博客
本节内容: 什么场景下会用roles? roles示例 一.什么场景下会用roles? 假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成php服务器,第三个要配置成MySQL服务 ...
- UEFI和Legacy及UEFI+Legacy启动的区别
uefi和legacy是两种不同的引导方式,uefi是新式的BIOS,legacy是传统BIOS.你在UEFI模式下安装的系统,只能用UEFI模式引导:同理,如果你是在Legacy模式下安装的系统,也 ...