Java反射

Java反射,第1张

Java反射
  • 廖雪峰Java反射

  • Class类

    • JVM为每个加载的类及接口创建了对应的Class实例来保存类及接口的所有信息;

      • Class类

        • public final class Class {
              private Class() {}
          }
          
      • 以String类为例,当JVM加载String类时,它首先读取String.class文件到内存,然后,为String类创建一个Class实例并关联起来

        • Class cls = new Class(String);
        • JVM持有的每个Class实例都指向一个数据类型(class或interface)
    • 通过Class实例获取class信息的方法称为反射(Reflection);

      • 获取

        • Class cls = String.class;
        • String s = "Hello"; Class cls = s.getClass()
        • Class cls = Class.forName("java.lang.String");
      • Class实例在JVM中是唯一的

      • 实例化

        • // 获取String的Class实例:
          Class cls = String.class;
          // 创建一个String实例:
          String s = (String) cls.newInstance();
          
    • JVM总是动态加载class,可以在运行期根据条件来控制加载class。

  • 访问字段

    • 访问Field: getFiled()
    • 访问字段信息:getName(), getType()…
    • 调用setAccessible(true)来访问非public字段
    • 通过反射读写字段是一种非常规方法,它会破坏对象的封装。
  • 访问调用方法

    • getMethod()
    • getNmae()
    • 通过Method实例可以调用某个对象的方法:Object invoke(Object instance, Object... parameters);
    • 通过设置setAccessible(true)来访问非public方法;
  • 构造方法

    • Constructor对象封装了构造方法的所有信息;
    • 通过Class实例的方法可以获取Constructor实例:getConstructor(),getConstructors(),getDeclaredConstructor(),getDeclaredConstructors();
    • 通过Constructor实例可以创建一个实例对象:newInstance(Object... parameters);
    • 通过设置setAccessible(true)来访问非public构造方法。
  • 获取继承关系

    • Class getSuperclass():获取父类类型;
    • Class[] getInterfaces():获取当前类实现的所有接口。
  • 动态代理

    • 动态代理是通过Proxy创建代理对象,然后将接口方法“代理”给InvocationHandler完成的。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/3985542.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-10-21
下一篇 2022-10-21

发表评论

登录后才能评论

评论列表(0条)

保存