zoukankan      html  css  js  c++  java
  • 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相关特性
  • 相关阅读:
    英语:漏屋-英语学习的真实方法及误区分析(转)
    TSP(旅行者问题)——动态规划详解(转)
    用二进制位表示状态,从而将状态压缩到一个整数里表示
    Android的CursorLoader用法小结
    RMQ问题ST算法 (还需要进一步完善)
    离散化
    反转(开关问题) POJ 3276
    关于序列中某个元素位置的查找
    快速幂运算
    Docker学习2-虚拟化
  • 原文地址:https://www.cnblogs.com/zhang-han/p/14392526.html
Copyright © 2011-2022 走看看