参考 JavaEE注解学习:(二)

在程序使用(解析)注解:获取注解中定义的属性值,并利用反射来调用方法

步骤1:获取注解定义的位置的对象  (Class,Method,Field)
步骤2:获取指定的注解
步骤3:调用注解中的抽象方法获取配置的属性值 

步骤 4.加载该类进内存
步骤5.创建对象

步骤6:获取方法对象
步骤7.执行方法
       

eg:

注解类proA

/**
 * @author KuKaFei.Hai
 * @date 2020/4/6 : 15:19
 * @Email : 383232084@qq.com
 */

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)      //给编译器看,所以是RunTime
public @interface ProA {
    String className();
    String methodName();
}

TestDomeA 类


/**
 * @author KuKaFei.Hai
 * @date 2020/4/6 : 15:30
 * @Email : 383232084@qq.com
 */
public class TestDomeA {
   public void show(){
       System.out.println("注解,理解真TM难......");
   }
}
AnnotationDemo 类(注解的解析类)
package cn.itcsast.Junit;

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

/**
 * @author KuKaFei.Hai
 * @date 2020/4/6 : 15:33
 * @Email : 383232084@qq.com
 */

@ProA(className = "cn.itcsast.Junit.TestDomeA",methodName = "show")
public class AnnotationDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
        /**
         * 根据注解给的参数,获取相应类和该类下的方法
         */
        //步骤一 :获取使用了注解类 AnnotationDemo 它的class 文件,目的是要利用反射,在其中找出使用注解  步骤一
        Class<AnnotationDemo> annoDemoClass = AnnotationDemo.class;
        //步骤二:通过反射创建注解类对象
        ProA annoProA = annoDemoClass.getAnnotation(ProA.class);
        /**
         * 通过反射创建注解类对象实质,就是在内存中生成了一个该注解接口的子类实现对象
         * public class annoProA implements ProA{
         *                 public String className(){
         *                     return "cn.itcsast.Junit.TestDemeA";
         *                 }
         *                 public String methodName(){
         *                     return "show";
         *                 }
         *
         *             }
         */
        //步骤三:调用注解对象中定义的抽象方法,获取返回值
        String className = annoProA.className();
        String methodName = annoProA.methodName();
        System.out.println(className);
        System.out.println(methodName);
        //步骤四.加载该类进内存
        Class demoClass = Class.forName(className);
        //步骤五.创建对象 1.8 getConstructor().newInstance() 取代了newInstance()
         Object obj = demoClass.getConstructor().newInstance();
        //Object obj = demoClass.newInstance();
        // 步骤六.获取方法
        Method method = demoClass.getMethod(methodName);
        // 步骤七.执行方法
        method.invoke(obj);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值