zoukankan      html  css  js  c++  java
  • 注解和反射

    一、注解

    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();
            }
        }
    

    简单总结

  • 相关阅读:
    Create Ubuntu DEB package from a Qt application
    Packaging a Qt application
    Ubuntu下安装Eclipse+QT我尽量让它详细点
    Mosh: the mobile shell
    PySide: Python for Qt 1.0发布 编程语言 ITeye资讯
    ubuntu用qt creator写的程序编译后生成的可执行文件复制到另一个系统中需要哪些文件才能运行
    Qt4小技巧——QTextEdit自动滚屏
    网站地图制作工具 Sitemap Creator 2.1
    Dependency Walker (depends.exe) Home Page
    秀一个PySide做的软件,网站地图制作工具 (Sitemap Creator)
  • 原文地址:https://www.cnblogs.com/kenai/p/14259780.html
Copyright © 2011-2022 走看看