• 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);
                }
            }
        }
    
    }
  • 相关阅读:
    Codeforces 631A Interview【模拟水题】
    Codeforces 651E Table Compression【并查集】
    Codeforces 651D Image Preview【二分+枚举】
    Codeforces 651C Watchmen【模拟】
    Codeforces 651B Beautiful Paintings【贪心】
    18.06.26 16年期末10:游览规划
    18.06.25 POJ4129 16年期末09:变换的迷宫
    18.06.25 POJ4150 16年期末07:上机
    18.06.25 16年期末06 42点
    18.06.25 16年期末01-05集合
  • 原文地址:https://www.cnblogs.com/topzhao/p/10266535.html
Copyright © 2020-2023  润新知