java 自定义注解的demo
前言
Java的Annotation是在5.0版本之后引入的,可以用于创建文档,跟踪代码中的依赖性,并且可以执行编译时期检查。注解就是给虚拟机看的,代表程序的一些特殊的功能。JDK中提供了@Override,@SuppressWarning,@Deprecated三种注解,当让还有元注@Target,@Retention,@Documented,@Inherited,元注解的作用负责注解其它注解。要想了解注解,就要了解自定义注解,了解是通过反射来实现的。
**注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。
元注解
元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种
@Inherited:说明子类可以继承父类中的该注解
@Document:说明该注解将被包含在javadoc中
@Target:注解的作用目标
[Java] 纯文本查看 复制代码
|
1
2
3
4
5
6
7
8
|
@Target(ElementType.TYPE) //接口、类、枚举、注解@Target(ElementType.FIELD) //字段、枚举的常量@Target(ElementType.METHOD) //方法@Target(ElementType.PARAMETER) //方法参数@Target(ElementType.CONSTRUCTOR) //构造函数@Target(ElementType.LOCAL_VARIABLE)//局部变量@Target(ElementType.ANNOTATION_TYPE)//注解@Target(ElementType.PACKAGE) ///包 |
@Retention:注解的保留位置
[Java] 纯文本查看 复制代码
|
1
2
3
|
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到 |
小例子:
1.自己定义一个注解
[Java] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
package com.Test; import java.lang.annotation.*; /** * @Author: cxx * @Date: 2018/3/15 11:47 */@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface Cxx { String value() default "haha"; } |
2.写一个测试demo
[Java] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
package com.Test; import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method; /** * @Author: cxx * @Date: 2018/3/15 12:14 */public class CxxTest { @Cxx(value = "test1") public void test1(){ System.out.println("test1()方法"); } @Cxx("test2") public void test2(){ System.out.println("test2()方法"); } public static void main(String[] args) throws InvocationTargetException, IllegalAccessException { Class clazz = CxxTest.class; Method[] methods = clazz.getMethods(); for (Method method : methods) { boolean flag = method.isAnnotationPresent(Cxx.class); if (flag){ Cxx c = method.getAnnotation(Cxx.class); System.out.println(c.value());// method.invoke(clazz.getInterfaces(),args); } } }} |
之后我们就能看到运行结果中test1,test2都打印出来了
这里再介绍invok的用法:
首先Method类代表一个方法,所以invoke(调用)就是调用Method类代表的方法。它可以让你实现动态调用,例如你可以动态的传人参数
[Java] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
|
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, InstantiationException { Class clazz = CxxTest.class; Method[] methods = clazz.getMethods(); for (Method method : methods) { boolean flag = method.isAnnotationPresent(Cxx.class); if (flag){ Cxx c = method.getAnnotation(Cxx.class); System.out.println("注解传入的参数:"+c.value()); method.invoke(clazz.newInstance()); } } } |
<ignore_js_op>![]()
转载:https://blog.csdn.net/m0_37499059/article/details/79566241
更多免费技术资料可关注:annalin1203

浙公网安备 33010602011771号