注解(Annotation)
就是java代码里的特殊标记,比如:@Override、@Test等,作用是:让其他程序根据注解信息来决定怎么执行该程序。注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处。
特殊属性名:value
如果注解中只有一个value属性,使用注解时,value名称可以不写!!
代码
package a6;
public @interface MyTest1 {
String aaa();
boolean bbb() default false;
String[] ccc();
}
package a6;
public @interface MyTest1 {
String aaa();
boolean bbb() default false;
String[] ccc();
}
package a6;
@MyTest1(aaa="牛魔王",ccc={"HTML","Java"})
// @MyTest2(value =“孙悟空”)
//@MyTest2("孙悟空")
@MyTest2("孙悟空")
public class AnnotationTest1{
@MyTest1(aaa="铁扇公主",bbb=false, ccc={"Python","前端","Java"})
public void test1() {
}
}
注解的原理
元注解
@Target
代码
ackage a6;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyTest3 {
}
package a6;
@MyTest3
public class AnnotationTest2 {
private String name;
@MyTest3
public void test(){
}
}
@Retention
代码
package a6;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)//控制下面的注解一直保留到运行时
public @interface MyTest3 {
}
package a6;
@MyTest3
public class AnnotationTest2 {
private String name;
@MyTest3
public void test(){
}
}
解析注解
案例
代码
package a6;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE,ElementType.METHOD
})
@Retention(
RetentionPolicy.RUNTIME
)
public @interface MyTest4 {
String value();
double aaa() default 100;
String[] bbb();
}
package a6;
@MyTest4(value ="蜘蛛精",aaa=99.5,bbb ={"至尊宝","黑马"})
public class Demo{
@MyTest4(value ="孙悟空",aaa=199.9,bbb ={"紫霞","牛夫人"})
public void test1(){
}}
import java.lang.reflect.Method;
import java.util.Arrays;
public class AnnotationTest3 {
@Test
public void parseClass() throws Exception {
// //先得到Class对象
// Class c = Demo.class;
// //判断类上是否包含了某个注解
// if (c.isAnnotationPresent(MyTest4.class)) {
// MyTest4 myTest4=(MyTest4) c.getDeclaredAnnotation(MyTest4.class
// );
// System.out.println(myTest4.value());
// System.out.println(myTest4.aaa());
// System.out.println(myTest4.bbb());
// }
//先得到Class对象
Class c = Demo.class;
Method m =c.getDeclaredMethod("test1");
//判断方法上是否包含了某个注解
if (m.isAnnotationPresent(MyTest4.class)) {
MyTest4 myTest4=(MyTest4) m.getDeclaredAnnotation(MyTest4.class
);
System.out.println(myTest4.value());
System.out.println(myTest4.aaa());
System.out.println(Arrays.toString(myTest4.bbb()));
}
}
}
运行结果
注解的应用场景
代码
package a6;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD) //注解只能注解方法
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}
package a6;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class AnnotationTest4 {
public void test1(){
System.out.println("test1");
}
@MyTest
public void test2(){
System.out.println("test2");
}
public void test3(){
System.out.println("test3");
}
@MyTest
public void test4(){
System.out.println("test4");
}
public static void main(String[] args) throws Exception {
AnnotationTest4 a= new AnnotationTest4();
//启动程序
//得到Class对象
Class c=AnnotationTest4.class;
//提取这个类的全部成员方法
Method[] methods = c.getDeclaredMethods();
//遍历这个数组中的每个方法,看方法上是否存在@MyTest
for (Method method : methods) {
if (method.isAnnotationPresent(MyTest.class)){
method.invoke(a);
}
}
}
}