Java反射+注解案例

注解类代码,注解的属性可以有多个:

package reflect;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/***
 * java注解默认只会保留在字节码文件里面
 * 运行期间注解会被抹掉
 * 可以用@Retention来指定注解的保留时间
 * 注:
 *     @Retention是元注解,即用来解释其他注解的注解
 *     Retentionpolicy.RUNTIME是表示注解保留到运行时。
 * @author zlq1252
 *
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
    /*
     * 注解的属性
    *
   *注解可以有多个属性。
   *如果属性名为value时,可以不制定属性名(只有一个属性时)
*/ public String value(); }

 

方法类,在方法类的方法上加上注解代码如下:

package reflect;

public class C {
    
    public void f1() {
        // TODO Auto-generated method stub
        System.out.println("C'S f1");
    }
    @Test(value="淡淡")
    public void hello() {
        // TODO Auto-generated method stub
        System.out.println("C'S hello");
    }
    @Test(value="洋洋")
    public void bala() {
        // TODO Auto-generated method stub
        System.out.println("C'S bala");
    }
}

 

反射类代码,通过反射类获得所有具有代码注解的方法并执行,同时可以过的注解的属性:

package reflect;

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

public class TestCase3 {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        String className = sc.nextLine();
        Class clazz = Class.forName(className);
        Object obj = clazz.newInstance();
        Method[] methods = clazz.getDeclaredMethods();
        for(Method mh:methods){
            //获得加在方法前面的@Test
            Test test = mh.getDeclaredAnnotation(Test.class);
            System.out.println("@Test:"+test);
            //执行带有注解的方法
            if(test!=null){
                mh.invoke(obj);
                //读取@Test的属性值
                String v1 = test.value();
                System.out.println("@Test的属性值:"+v1);
            }
        }
    }

}

 

posted on 2019-01-14 14:20  Top丶赵立全  阅读(172)  评论(0编辑  收藏  举报

导航