反射之简单语法备忘录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangwenhaojf40it/article/details/80511724

例子代码 :

父类 Person 中 有 成员变量 性别,和 梦想 的方法

子类 Boy 中有成员变量 年龄 和 姓名

其中 年龄 属于隐私 被 private 修饰

父类 Person

public class Person {
    public int gender;

    public void dream() {
        System.out.println("我做梦都想开飞机" );
    }

}

子类 Boy

public class Boy extends Person {

    public String name;

    private String age;

    public void eat(String food) {
        System.out.println(food );
    }
    private void run() {

        System.out.println("换个姿势,再来一遍" );
    }
}

不管是获取属性,还是获取方法,首先要搞到 Class 对象
方法一: Class clz = Boy.class
方法二: Class clz = Class.forName(“hao.wen.zhang.testinvok.Boy”);

获取单个属性

区别: clz.getDeclaredField() 可以访问私有成员变量

  • Field age = clz.getField(“name”);

  • Field gender = clz.getDeclaredField(“gender”);

获取所有属性

区别:
getFields() 获取 能正常访问到的成员变量 包括 父类的(不包含继承系统的,如:Object)
getDeclaredFields() 获取当前类所有成员变量 不管你爹是谁,不管你修饰符,只管自己

  • Field[] fields1 = clz.getFields();
  • Field[] fields = clz.getDeclaredFields();

获取单个方法及调用

  • 调用 有访问权限的方法 & 有参数
  public void invokeMethod() {
        Class clz = Boy.class;
        try {
            Boy boy = (Boy) clz.newInstance();
            Method eat = clz.getMethod("eat", String.class);
            eat.invoke(boy, "想吃小鸡炖蘑菇");
        } catch (Exception e) {
            e.printStackTrace();

        }
    }
输入语句:
05-30 15:50:49.264 22686-22686/hao I/System.out: 想吃小鸡炖蘑菇
  • 调用 私有方法 & 无参数
   public void invoidPrivateMethod() {
        Class clz = Boy.class;
        try {
            Boy boy = (Boy) clz.newInstance();
            //getDeclaredMethod  可以获得私有方法
            Method eat = clz.getDeclaredMethod("run");
            //被private修饰后  调用此方法才可访问
            eat.setAccessible(true);
            eat.invoke(boy);
        } catch (Exception e) {
            e.printStackTrace();

        }

    }
输出语句:
05-30 15:56:16.695 23861-23861/? I/System.out: 换个姿势,再来一遍

获取所有方法:

  • clz.getMethods()

    • 获取的是 自身有访问权限 及 父类的方法 包括 系统Object类
  • getDeclaredMethods()

    • 获取的是自身的所有方法 (包括私有的)

这里写图片描述

猜你喜欢

转载自blog.csdn.net/zhangwenhaojf40it/article/details/80511724