java反射机制

  1. Class

    获取Class对象有三种方式

    • 通过Object.getClass();

      Object obj = new Object();
      Class clazz = obj.getClass();
    • 任何数据类型(包括基本数据类型)都有一个“静态”的class属性

      Class clazz = Object.class;

    • 通过Class类的静态方法:forName(String className)

      Class clazz = Class.forName("com.XX.XX.Object");

  2. 实例化对象Constructor

    • 获取构造方法

      1). 批量方法

      public Constructor[] getConstructors()://所有"公有的"构造方法 
      public Constructor[] getDeclaredConstructors()://获取所有的构造方法(包括私有、受保护、默认、公有) 

      2). 获取单个构造方法

      public Constructor getConstructor(Class... parameterTypes) //获取单个的"公有的"构造方法
      public Constructor getDeclaredConstructor(Class... parameterTypes) //获取"某个构造方法"可以是私有的,或受保护、默认、公有
    • 调用构造方法

      constructor.newInstance();

      //1.加载Class对象
      Class clazz = Class.forName("Student");
      ​
      //2.获取公有、无参的构造方法
      Constructor con = clazz.getConstructor(null);
      ​
      //3.调用构造方法
      Object obj = con.newInstance();
      ​
      //4.获取私有构造方法
      con = clazz.getDeclaredConstructor(String.class);
      ​
      //5.调用私有构造方法
      con.setAccessible(true);//暴力访问(忽略掉访问修饰符)
      obj = con.newInstance("x");

  3. 获取方法Method

    1). 批量方法

    public Method[] getMethods();// 获取所有"公有方法";(注:包含了父类的方法也包含Object类)
    public Method[] getDeclaredMethods();// 获取所有的成员方法,包括私有的(注:不包括继承的)

    2). 获取指定方法

    public Method getMethod(String name,Class<?>... parameterTypes): //获取公共方法,参数:name : 方法名;Class ... : 形参的Class类型对象
    public Method getDeclaredMethod(String name,Class<?>... parameterTypes) // 获取私有方法

    3). 方法调用

    Method.invoke(Object obj,Object... args); //obj : 要调用方法的对象;args:调用方式时所传递的实参;

    在调用“私有方法”的之前,必须要加上method.setAccessible(true);来解除私有限定

  4. 获取字段

    2). 批量方法

    public Field[] getFields(): //获取所有的"公有字段";(注:包含了父类的字段也包含Object类)
    public Field[] getDeclaredFields()// 获取所有的成员字段(注:不包括继承的)

    2). 获取指定字段

    public Field getField(String fieldName):获取某个"公有的"字段;
    public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)

    3). 方法调用

    field.set(Object obj,Object value) //obj : 要设置的字段的对象;value:要为字段设置的值;

    在为“私有字段”赋值的之前,必须要加上 field.setAccessible(true);来解除私有限定 。

代码示范可以参考,https://gitee.com/kaigee/reflect

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值