前言
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());
}
}
}
|
转载:https://blog.csdn.net/m0_37499059/article/details/79566241
更多免费技术资料可关注:annalin1203