• 注解和反射


    一、注解

    annotation:注解

    1、什么是注解

    作用

    • 不是程序本身,可以对程序做出解释。
    • 可以被其他程序读取。

    格式

    @XXXXX(value="")

    那里使用

    package、class、method、field。

    2、元注解

    • @Target :用于描述注解的使用范围。
    • @Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期。(SOURCER<CLASS<RUNTIME)
    • @Document:说明该注解将被包含在Javadoc中。
    • @Inherited:说明子类可以继承父类中的该注解。

    创建一个简单注解

    @Target({ElementType.METHOD,ElementType.TYPE}) //作用到方法上
    @Retention(RetentionPolicy.RUNTIME) //表示什么地方有效
    @Documented //表示是否将我们的注解生成在JAVAdoc中
    @Inherited //子类可以继承父类的注解
    public @interface MyAnnotation {
        String name() default "666";
        int age() default 18;
    }
    

    二、反射

    1、什么是反射

    允许程序在执行期借助Reflection取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。

    优点:

    可以实现动态创建对象和编译,体现出很大的灵活性。

    缺点:

    对性能有影响,使用反射是一种解释操作,我们可以告诉JVM,我们希望做什么并且他满足我们的要求。

    2、API

    1、获取class对象。

    Class name = Class.forName("Test2.Son");
    Class<Son> sonClass = Son.class;
    Class<? extends Son> aClass = son.getClass();
    Class<Integer> type = Integer.TYPE;
    Class<?> superclass = aClass.getSuperclass();//获取父类
    

    什么会有class对象

    class,interface,[],enum,annotation,primitive type,void。

    2、class对象API。

    //获取包名+类的名字
    name.getName();
    //获取类名
    name.getSimpleName();
    //获取类的public属性
    Field[] fields = name.getFields();
    //获取类的全部属性
    Field[] declaredFields = name.getDeclaredFields();
    //获取指定public属性的值
    Field[] value = name.getFields("xxx");
    //获取类的方法
    name.getMethods();
    //获取指定方法
    name.getMethod("methodname",paraType);
    //获取指定构造器
    name.getConstructors();
    ......
    

    3、获取泛型信息

    Class name = Class.forName("Test2.Son");
    Method test = name.getMethod("test", List.class);
    Type[] types = test.getGenericExceptionTypes();
    

    4、获取注解信息

    Class name = Class.forName("Test2.Son");
    Method test = name.getMethod("test", List.class);
    MyAnnotation annotations = test.getAnnotation(MyAnnotation.class);
    System.out.println(annotations.age());
    System.out.println(annotations.name());
    

    5、动态执行方法

    /**
         * 
         * @param obj
         *            待执行方法的对象
         * @param ClassName
         *            待执行方法对象的类
         * @param MethodName
         *            待执行的方法名
         * @param ParameterValue
         *            待执行方法的参数
         */
        public void execute(Object obj, String ClassName, String MethodName,
                String ParameterValue) {
            Class cls = null;
            try {
                cls = Class.forName(ClassName);
            } catch (ClassNotFoundException e) {
                // 通过ClassName反射获取该类失败
                e.printStackTrace();
            }
            Method method = null;
            try {
                method = cls.getMethod(MethodName, String.class);
            } catch (SecurityException e) {
                // 通过MethodName反射获取该方法失败,SecurityManager校验失败
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // 通过MethodName反射获取该方法失败,该方法不存在
                e.printStackTrace();
            }
            try {
                method.invoke(obj, ParameterValue);
            } catch (IllegalArgumentException e) {
                // 反射执行该方法失败,参数不正确
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // 反射执行该方法失败,无法执行
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // 反射执行该方法失败,该方法本身抛出异常
                e.printStackTrace();
            }
        }
    

    简单总结

  • 相关阅读:
    沙盒配置好的测试
    云端存储的实现:云存储1
    演职人员名单MobileMenuList
    关于GitHub的朋友的NE Game
    到了冲刺阶段
    云存储的配置3
    刚才花了1$赞助了那位伙计
    我知道这对自己是个积累的过程,很好,我成长的很快
    煎熬过后终于有一刻释怀
    空白不曾停止。。。
  • 原文地址:https://www.cnblogs.com/kenai/p/14259780.html
Copyright © 2020-2023  润新知