• java基础(Reflection--反射)


     反射机制

      – 指的是可以于运行时加载、探知、使用编译期间完全未知的类。
      – 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法;
         对于任意一个对象,都能够调用它的任意一个方法和属性;
        Class c = Class.forName("com.bjsxt.test.User");
      – 加载完类之后,在堆内存中,就产生了一个 Class 类型的对象(一个类只有一个 Class 对象),这个对象就包含了完整的类的结构信息。
      我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。

    Class类

      java.lang.Class类十分特殊,用来表示java中类型(class/interface/enum/annotation/primitive type/void)本身。
        – Class类的对象包含了某个被加载类的结构。一个被加载的类对应一个Class对象。
        – 当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class 对象。
      Class类是Reflection的根源。
        – 针对任何您想动态加载、运行的类,唯有先获得相应的Class 对象
      Class对象的获取:
        运用getClass()
        运用Class.forName()(最常被使用)
        运用.class 语法

    反射机制的作用:

      • 动态加载类、动态获取类的信息(属性、方法、构造器)
      • 动态构造对象
      • 动态调用类和对象的任意方法、构造器
      • 动态调用和处理属性
      • 获取泛型信息
      • 处理注解
     

    反射操作泛型(Generic)

      • Java采用泛型擦除的机制来引入泛型。Java中的泛型仅仅是给编译器javac使用的,确保数据 的安全性和免去强制类型转换的麻烦。
       但是,一旦编译完成,所有的和泛型有关的类型全部 擦除。 • 为了通过反射操作这些类型以迎合实际开发的需要,Java就新增了
        ParameterizedType, GenericArrayType,TypeVariable 和WildcardType几种类型来代表不能被归一到Class 类中的类型但
       是又和原始类型齐名的类型。
      • ParameterizedType: 表示一种参数化的类型,比如Collection<String>
      • GenericArrayType: 表示一种元素类型是参数化类型或者类型变量的数组类型
      • TypeVariable: 是各种类型变量的公共父接口
      • WildcardType: 代表一种通配符类型表达式,比如?, ? extends Number, ? super Integer【 wildcard是一个单词:就是“通配符”】
     

    反射操作注解(Annotation)

      可以通过反射API:getAnnotations, getAnnotation获得相关的注解信息

    //获得类的所有有效注解
                Annotation[] annotations=clazz.getAnnotations();
                for (Annotation a : annotations) {
                    System.out.println(a);
                }
                //获得类的指定的注解
                SxtTable st = (SxtTable) clazz.getAnnotation(SxtTable.class);
                System.out.println(st.value());
                
                //获得类的属性的注解
                Field f = clazz.getDeclaredField("studentName");
                SxtField sxtField = f.getAnnotation(SxtField.class);
                System.out.println(sxtField.columnName()+"--"+sxtField.type()+"--"+sxtField.length());

    反射机制性能问题

    • setAccessible
      – 启用和禁用访问安全检查的开关,值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
        值为 false 则指示反射的对象应该实施 Java 语言访问检查。并不是为true就能访问为false就不能访问。
      – 禁止安全检查,可以提高反射的运行速度。
    • 可以考虑使用:cglib/javaassist字节码操作</
     
  • 相关阅读:
    ASP.NET MVC案例——————拦截器
    Windows Azure Virtual Network (10) 使用Azure Access Control List(ACL)设置客户端访问权限
    Windows Azure Storage (20) 使用Azure File实现共享文件夹
    Windows Azure HandBook (5) Azure混合云解决方案
    Windows Azure Service Bus (6) 中继(Relay On) 使用VS2013开发Service Bus Relay On
    Azure PowerShell (9) 使用PowerShell导出订阅下所有的Azure VM的Public IP和Private IP
    Windows Azure Service Bus (5) 主题(Topic) 使用VS2013开发Service Bus Topic
    Azure China (9) 在Azure China配置CDN服务
    Windows Azure Storage (19) 再谈Azure Block Blob和Page Blob
    Windows Azure HandBook (4) 分析Windows Azure如何处理Session
  • 原文地址:https://www.cnblogs.com/skyline1/p/11327363.html
Copyright © 2020-2023  润新知