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相关特性
  • 相关阅读:
    js变量如何赋值给css使用?
    前端预览与下载PDF小结
    子组件如何改父组件传过来的值
    TensorRT转换时的静态模式与动态模式
    Linux:搭建GlusterFS文件系统
    OpenFeign传输文件MultipartFile
    Docker:commit、export、import、save、load命令的使用
    Git:代码版本回退
    docker安装Drools Workbench
    ArchLinux:Typora设置gitee图床
  • 原文地址:https://www.cnblogs.com/zhang-han/p/14392526.html
Copyright © 2011-2022 走看看