Java--注解

注解(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);
            }
        }

    }
}

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值