【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 "进行面向对象的设计时,一项主要的考虑是:怎样将发生变 ...
随机推荐
- TNS-12535/12606 and ORA-3136 on Connection to Database (Doc ID 2313573.1)
今天遇到一问题 telnet 都是通的,但是两台数据库服务器还是无法 sqlplus 连接 ,最后发现 两台服务器的 mtu 值不同,其中一台为 1500 一台为9000, 以前只是认为 telnet ...
- Locust:简介和基本用法
我个人在性能测试工作中,负载生成工具使用的大多都是jmeter,之前学习python时顺带了解过python开源的性能测试框架locust. 这篇博客,简单介绍下locust的使用方法,仅供参考... ...
- 可视化工具Grafana:简介及安装
随着业务的越发复杂,对软件系统的要求越来越高,这意味着我们需要随时掌控系统的运行情况.因此,对系统的实时监控以及可视化展示,就成了基础架构的必须能力. 这篇博客,介绍下开源的可视化套件grafana的 ...
- 基于HTML5 的互联网+地铁行业
前言 近几年,互联网与交通运输的融合,改变了交易模式,影响着运输组织和经营方式,改变了运输主体的市场结构.模糊了运营与非营运的界限,也更好的实现了交通资源的集约共享,同时使得更多依靠外力和企业推动交通 ...
- docker WARNING: IPv4 forwarding is disabled 问题解决
问题: [yuyongxr@localhost ~]$sudo docker run -d --name nginx -p : nginx WARNING: IPv4 forwarding is di ...
- max-height、min-height、height优先级的问题
前言 我们在实际开发中可能会限制元素的最大高度,那么我们使用的属性必定是max-height,那么不知道大家有没有考虑过如果同时设置max-height和height会发生什么呢? max-heigh ...
- Git各个状态之间转换指令总结
基本状态标识 A- = untracked 未跟踪 A = tracked 已跟踪未修改 A+ = modified - 已修改未暂存 B = staged - 已暂存未提交 C = committe ...
- 解决SpringSecurity阻止ajax的POST和PUT请求,导致403Forbidden的问题
前言: 最近在整合springboot+springsecurity,在PUT请求的时候出现了403的问题,这里记录一下解决的过程 到Spring的官网去查查SpringSecurity的参考手册看看 ...
- CentOS修改SSH端口号和禁止root用户直接登录
linux安装ssh远程登录后,为了安全起见,修改默认的22端口号并禁止root用户直接通过ssh登录. 配置方法如下: 1.使用vi编辑器打开ssh配置文件 /etc/ssh/sshd_config ...
- hdu-3416(最短路+网络流)
题意:给你一个有向权图,问你从S到E有几条最短路,每条边直走一次的情况下: 解题思路:每条边直走一次,最大流边权为1,因为要算几条最短路,那么能得到最短路的路径标记下,然后跑最大流 代码: #incl ...