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实例都指向一个数据类型(classinterface
          • 在这里插入图片描述

          • 在这里插入图片描述

    • 通过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完成的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值