java 反射

概念

在运行过程中,可以获得任何一个类的属性/方法,能够调用任何一个对象的属性/方法.动态获取信息和调用对象的功能称为反射.

具体功能

  • 运行时判断一个对象的所属类
  • 运行时调用一个对象的方法
  • 运行时构造一个类的对象
  • 运行时判断一个类所具有的成员变量和方法
  • 生成动态代理

API

  • 根据类获得Class对象

    • Class.forName(xxxx);xxxx是类/java.lang.String完全限定名
    • Class<?> className = xxxx.class;
    • Class<?> className = xxxx.getClass();
  • 判断对象是否是某个类的实例

    • xxxx.isInstance(Object object);
  • 根据对象创建新的实例
    • Class<?> className = xxxx.class;
      Object ccccc = className.newInstance();
    • Class<?> className = xxx.class;
      Constructor constructor = className.getConstructor(xxx.class);
      Object object = constructor.newInstance("xx")
  • 根据类获取类的方法
    • className.getDeclaredMethods()获取类/接口 的所有方法(包括私有,除了继承的方法)
    • className.getMethods()获取类的public方法及其继承类的public方法(包括Object的通用方法…)
    • className.getMethod("方法名", 参数对象(int.class), 参数对象(int.class),....)获取特定方法
  • 根据类获取类的成员变量
    • className.getFiled();访问public变量
    • className.getFileds();
    • className.getDeclaredField()访问所有成员变量,但不包括父类成员变量
    • className.getDeclaredFields()
  • 调用类中的方法
    • Object object = className.newInstance();
      Method method = className.getMethod("方法名", args[className]);
      Object result = method.invoke(object, args[])
  • 反射创建数组
    • Object array = Array.newInstance(className, 16);
      Array.set(array, 0, arg[className]);

注意:反射invoke()调用方法可能会破坏封装性,造成安全问题.

借鉴于:
https://www.sczyh30.com/posts/Java/java-reflection-1/
https://www.tianmaying.com/tutorial/Java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值