Loading

Java反射

通过反射获取Class对象的三种方法对应java代码在计算机中的三个阶段:

  1. 源代码阶段:这个时候java文件和class文件还存储在硬盘中,未加载到内存,想要获取这个Class需要使用Class.forName("全类名")进行加载;

    (参数为字符串,多用于配置文件,读取文件加载类)

  2. 当一个类已经被加载到内存中了,可以使用 “类名.class” 获取;

    (多用于参数的传递)

  3. 当一个类被加载到内存中并且被实例化了,就可以调用对象的 “getClass()” 方法获取Class。

    (多用于对象的获取字节码的方式)

重要结论:

  1. 同一个(*.class)文件在一次程序运行过程中,只会被加载一次,使用三种方式获取到的Class对象均为一个Class对象。

获取Field:

  • class.getFields() & class.getDeclaredFields();也可以获取指定名称的Field;
  • field.get(obj) & field.set(obj,value);获取或者设置field的值,传入的obj指定一个对象;注意在获取private修饰的field时要先设置:field.setAccessible(true);

获取Constructor:

  • class.getConstructor(...),例如:

    Constructor constructor = personClass.getConstructor(String.class, int.class);
    //使用有参构造器构造对象
    Object obj=constructor.newInstance("name",23);
    
  • 当然也可以获取无参构造,并通过无参构造生成对象,不过建议直接使用Class的newInstance()方法。

    Object o = personClass.newInstance();
    
  • 注意,和Field一样,也有declared与setaccessible相关特性

获取Method

  • class.getMethod()
  • class.getMethods()
  • method.invoke(obj,arg) //执行方法,obj为方法载体,arg为方法参数
  • 也有declared与setaccessible相关特性
posted @ 2021-02-09 12:19  沿途有余弦  阅读(50)  评论(0)    收藏  举报