举例讲解JDK注解的使用和自定义注解的方法
作者:Melissa_hexiu 发布时间:2022-06-29 17:34:52
标签:jdk,注解,自定义注解
JDK中的三个基本注解
a、@Override:检查子类确实是覆盖了父类的方法。
b、@Deprecated:说明已经过时了。
c、@SuppressWarnings({ "unused", "deprecation" }):抑制程序中的警告。unused警告的类型。{}数组。all抑制所有警告。
简单使用:
public class Demo1 {
//@SuppressWarnings({ "deprecation", "unused" })
@SuppressWarnings("all")
public void fun()
{
int i = 5;
System.out.println("hello");
System.out.println(new Date().toLocaleString());
}
}
class Tests extends Demo1
{
@Override
public void fun()
{
super.fun();
}
@Deprecated
public void tt()
{
System.out.println(new Date().toLocaleString());
}
}
声明一个注解 @interface 注解名{}
public @interface MyAnnotation{}
注解它的本质就是一个接口,这个接口需要继承 Annotation接口。
public interface MyAnnotation extends java.lang.annotation.Annotation {
}
注解的属性类型:
1.基本类型
2.String
3.枚举类型
4.注解类型
5.Class类型
6.以上类型的一维数组类型
具体是怎样定义的呢,我们看代码:
public @interface MyAnno1 {
//注解中定义的都是属性
int age() default 20;
String[] name() default "hehe";
String value() default "haha";
Love love();
//MyAnno2 anno();
//public static final int num = 5;//可以
//public abstract void fun();//error
}
使用自定义注解:
public class Demo2 {
//@MyAnno1(age=25,name={"jack","lucy"},value="zhengzhi")
//@MyAnno1(value="zhengzhi")
@MyAnno1(value="zhengzhi",love=Love.eat)
public void tests()
{
}
}
如果在没有默认值的情况下,使用自定义注解我们需要设置注解中属性的值。
注解的反射:(灵魂)
模拟Junit的@Test
a、反射注解类
java.lang.reflect.AnnotatedElement:
<T extends Annotation> T getAnnotation(Class<T> annotationType):得到指定类型的注解引用。没有返回null。
Annotation[] getAnnotations():得到所有的注解,包含从父类继承下来的。
Annotation[] getDeclaredAnnotations():得到自己身上的注解。
boolean isAnnotationPresent(Class<? extends Annotation> annotationType):判断指定的注解有没有。
Class、Method、Field、Constructor等实现了AnnotatedElement接口.
如果:Class.isAnnotationPresent(MyTest.class):判断类上面有没有@MyTest注解;
Method.isAnnotationPresent(MyTest.class):判断方法上面有没有@MyTest注解。
下面通过代码实现一下。
我们模拟实现@Test注解的功能
首先这是我们的注解@MyTest
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//元注解: 用来注解注解的
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
long timeout() default Integer.MAX_VALUE;//设置超时时间的
}
这是我们使用注解的类:
public class DBCRUD {
@MyTest(timeout=1000000)
public void addTest()
{
System.out.println("addTest方法执行了");
}
@MyTest
public void updateTest()
{
System.out.println("updateTest方法执行了");
}
}
当我们使用了注解,我们就需要判该类是否使用了注解,我们通过反射来实现。
private static void method1() throws IllegalAccessException,
InvocationTargetException, InstantiationException {
Class claz = DBCRUD.class;//得到字节码文件对象
//得到该类及父类中的所有方法
Method[] methods = claz.getMethods();
for(Method m:methods){
//判断方法是否使用了@MyTest这个注解
// boolean boo = m.isAnnotationPresent(MyTest.class);
// System.out.println(m.getName()+"===="+boo);//都是false 默认注解存活到 CLASS,改变存活到RUNTIME
if(m.isAnnotationPresent(MyTest.class)){
m.invoke(claz.newInstance(), null);
}
}
}
这里我们需要注意的是,我们需要考虑到自定义注解的存活范围。
默认的自定义注解只存活到编译时期,class阶段。
可以注意到,我们上面的自定义注解应用了@Retention注解,这个注解就是改变自定义注解的存活范围。
这个注解也叫做元注解,只能用在注解上的注解叫做元注解。
上面的method方法没有考虑到超时的问题,下面我们再完善一下。
//method1();
//反射解析注解的属性
Class claz = DBCRUD.class;
Method[] methods = claz.getMethods();
for(Method m:methods){
//从该方法上获取MyTest注解
MyTest mt = m.getAnnotation(MyTest.class);
if(mt!=null){
//得到注解中的属性
long out = mt.timeout();
long start = System.nanoTime();
m.invoke(claz.newInstance(), null);
long end = System.nanoTime();
if((end-start)>out)
{
System.out.println("运行超时");
}
}
}
来源:https://blog.csdn.net/melissa_heixiu/article/details/52768816


猜你喜欢
- 访问静态资源的配置及顺序今天在玩SpringBoot的demo的时候,放了张图片在resources目录下,启动区访问的时候,突然好奇是识别
- Java Hibernate对象
- Springboot 在普通类型注入Service或mapper最近遇到一个难题(大佬可能感觉这太简单了把),对于我这样的小白来说,确实有些
- ubuntu 安装jdk 的两种方法总结:1:通过ppa(源) 方式安装.2:通过官网下载安装包安装.这里推荐第1种,因为可以通过 apt-
- 本文实例讲述了android编程实现设置、打开wifi热点共享供他人连接的方法。分享给大家供大家参考,具体如下:用过快牙的朋友应该知道它们在
- 传输层安全性协议(英语:Transport Layer Security,缩写作 TLS),及其前身安全套接层(Secure So
- 差不多一年前在自己的项目中用过这效果,虽然很简单,但还是写写。1、首先在你的res目录下新建anim子目录,并在anim目录下新建两个文件:
- @RequestBody搭配@Data的坑如果用@Data修饰实体类,里面的属性最好不要用连续几个相同字母,如果用千万别用大写。比如下面这个
- 详解Http请求中Content-Type讲解以及在Spring MVC中的应用引言: 在Http请求中,我们每天都在使用Content-t
- 本文介绍了spring cloud Feign使用中遇到的问题总结,分享给大家,具体如下:问题一:在前面的示例中,我们讲过@RequestM
- 一、需要导入的jar1.commons-collections4-4.1.jar2.poi-3.17-beta1.jar3.poi-ooxm
- 开发中经常遇到从集合类List、Map中取出数据转换为String的问题,这里如果处理不好,经常会遇到空指针异常java.lang.Null
- 最近该忙的都忙完了,自己自定义一直是个弱项,也一直想整个钟表玩玩,网上看了一圈,学习了不少,下面自己做做自定义首先,制作钟表第一步,肯定是画
- 爱java 爱dota,突发奇想想用java开发dota操作最华丽的英雄之一的卡尔的技能,因为本人系小白,代码不足的地方还请包涵,有同样爱好
- 本文实例分析了Android编程之TextView的字符过滤功能。分享给大家供大家参考,具体如下:TextView可以设置接受各式各样的字符
- 1、SDK下载很慢。配置SDK代理,速度像飞一样。建议先把20-24下完,不然后面遇到很多问题。2、support-v7的问题例如res\v
- 走马灯是一种常见的效果,本文讲一下如何用 PageView 在 Flutter 里实现一个走马灯, 效果如下,当前页面的高度比其它页面高,切
- 本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理。分享给大家供大家参考。具体分析如下:Timer类:设置一个定时器,定时执行用户
- 缘起工作时使用java开发服务器后台,用Jersey写Restful接口,发现有一个Post方法始终获取不到参数,查了半天,发现时获取参数的
- 本文实例讲述了Java基于递归和循环两种方式实现未知维度集合的笛卡尔积。分享给大家供大家参考,具体如下:什么是笛卡尔积?在数学中,两个集合X