注解

注解:

jdk5之后提供了一个特性,和类 接口同级
格式:

    @interface 注解名{}

作用:

    编译检查
    替代配置文件
    定义注解(元注解:注解上的注解)
    分析代码(用到反射)

java中3个注解:(理解)

    @Override:声明该方法是从分类上继承过来的,执行编译期的检查
    @SuppressWarnings:抑制警告 值有好多,只需要知道一个 all  抑制所有的警告
    @Deprecated:声明 该方法不赞成使用

自定义注解:(理解)

        注解本质就是一个接口,接口中可以有常量和抽象方法
        抽象方法在注解中就称之为注解属性

注解属性类型:

        基本类型
        String
        Class
        Annotation
        Enum:枚举
        以上类型对应的一维数组
    注意:
        一旦注解有属性了,使用注解的时候必须赋值,(除非这个注解属性有默认值)

赋值的格式:

        @注解名(属性名=属性值)
        若注解类型为数组,且只有一个值的时候,可以有两种写法
            方式1:
                属性名 = { 值 }
            方式2:
                属性名=属性值
        若属性名为value的时候,且只需要为这个value属性赋值的时候,value可以省略

元注解:(理解)

        定义在注解上的注解
            @Retention  规定注解保留到什么阶段  值为RetentionPolicy的三个枚举值
                SOURCE:只在代码中保留,在字节码文件中就删除了
                CLASS:在代码和字节码文件中保留
                RUNTIME:所有阶段都保留

            @Target 规定注解作用在什么上面     值为ElementType的枚举值
                TYPE:作用在类 接口 等上面
                METHOD:作用方法上面
                FIELD:作用字段上面

案例1-模拟junit测试
需求:

在一个类的方法中添加一个@MyTest,在另一个类的main方法中,就可以执行带有@MyTest的方法

技术分析:

注解
反射

步骤分析:(了解)

    1.定义一个注解 @MyTest
    2.在一个测试类 MyTestTest 上的添加几个方法
        在方法上添加@MyTest
    3.在另一个有主方法的类上添加main方法
        运行main方法的时候,需要将带有 @MyTest注解的方法执行

第一步:定义一个注解 @MyTest


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//注解在运行时保留
@Retention(RetentionPolicy.RUNTIME)

//注解只能作用在方法上
@Target(ElementType.METHOD)
public @interface MyTest {

}

第二步:在一个测试类 MyTestTest 上的添加几个方法
在方法上添加@MyTest

public class MyTestTest {

    @MyTest
    public void f1(){
        System.out.println("f1方法执行了。。。");
    }

    public void f2(){
        System.out.println("f2方法执行了。。。");
    }
    @MyTest
    public void f3(){
        System.out.println("f3方法执行了。。。");
    }
}

第三步:在另一个有主方法的类上添加main方法
运行main方法的时候,需要将带有 @MyTest注解的方法执行

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MainTest {

    public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
        //运行这个类的时候 需要将 测试类中带有@mytest所有方法执行
        //获取字节码对象
        Class clazz=MyTestTest.class;

        //获取所有的方法
        Method[] arr = clazz.getMethods();

        //让带有注解的方法执行
        for (Method m : arr) {
            //获取有注解的方法

            //判断方法是否有指定的注解 
            boolean flag=m.isAnnotationPresent(MyTest.class);

            if(flag){
                //System.out.println(m.getName());
                m.invoke(clazz.newInstance());
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值