• Java 反射机制



    参考文章:

      老顽童周伯通 知乎上的回答

      深入解析Java反射(1) - 基础

     


     

    1. Java反射机制

    1.1 什么 Java 反射机制

      反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

      对于任意一个对象,都能够调用它的任意一个方法和属性;

      这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。

    1.2 为什么用反射

      当程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到 JVM,而是在运行时根据需要才加载,这样的好处对于服务器来说不言而喻,举个例子我们的项目底层有时是用 MySQL,有时用 Oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了。

      假设 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection 这两个类我们要用,这时候我们的程序就写得比较动态化,通过Class tc = Class.forName("com.java.dbtest.TestConnection"); 通过类的全类名让 JVM 在服务器中找到并加载这个类。而如果是 Oracle 则传入的参数就变成另一个了。这时候就可以看到反射的好处了,这个动态性就体现出 Java 的特性了!

      反射的核心是 JVM 在运行时才动态加载类或调用方法/访问属性

      反射一般用于框架中,在使用 Spring Boot 框架过程中使用的一些配置文件都是反射在框架中的应用。

    1.3 反射的使用

      所有的类,都存在一个类对象。类对象就是用于描述这种类包含的属性与方法。
      下面是获取类对象的三种方式
     

    1.3.1 使用 Class 类的 forName 静态方法

    //forName方法
    public static Class<?> forName(String className)
    
    //在JDBC开发中常用此方法加载数据库驱动:
    Class.forName(driver);

     

    1.3.2 直接获取一个对象的 Class

    Class class2 = Student.class;
    System.out.println(class2);

     

    1.3.3 调用某个对象的 getClass() 方法

    StringBuilder str = new StringBuilder("123");
    Class<?> klass = str.getClass();

     

    1.4 成员变量

      方法

    //返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段
    getField(String name)
    
    //返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段
    getFields()
    
    //返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段
    getDeclaredField(String name) 
    
    //给某个对象的本成员变量赋值为value
    set(Object obj,Object value)

     

    1.5 构造方法

      方法

    //通过参数的类型和个数获取指定的构造方法,只能是公共的构造
    Constructor con = clazz.getConstructor(String.class);
     
    //获取非public修饰的,加Declared.
    Constructor con = clazz.getDeclaredConstructor(String.class);
    
    //(设置可访问性)暴力破解
    con.setAccessible(true);

    //创建此 Class 对象所表示的类的一个新实例
    Object obj = con.newInstance(10L);

      demo

    //空参构造
    Class c = Class.forName(“com.test.Person”);
    Constructor con = c.getConstructor();//获取空参构造方法
    Object obj = con.newInstance();//创建对象
    
    //带参构造
    Class c = Class.forName(“com.Person”);
    Constructor con = c.getConstructor(String.class,int.class);
    Object obj = con.newInstance(“tom”,11);
    
    //通过带Declared字样的方法获取指定的构造方法
    Class c = Class.forName(“com.Person”);
    Constructor con = c.getDeclaredConstructor(String.class);
    Object obj = con.newInstance(11);

     

    1.6 成员方法

      方法

    //无参无返回值
    
    //获取所有的公共成员方法
    getMethods()
    //获取所有成员方法
    getDeclaredMethods()
    //获取指定的公共成员方法
    getMethod(String name)
    //获取指定的成员方法
    getDeclaredMethod(String name)
    
    setAccessible(boolean bool)
    
    //有参有返回值
    
    Class c = Class.forName();
    Method m = c.getDeclaredMethod(“setAge”,int.class);
    Person p = new Person();
    Object obj = m.invoke(p,20);

    且将新火试新茶,诗酒趁年华。
  • 相关阅读:
    C#中关于值类型和引用类型的区别
    Win32_PhysicalMedia 硬盘 参数说明
    Win32_DiskDrive 硬盘 参数说明
    Win32_Processor CPU 参数说明
    通过EF操作Sqlite时遇到的问题及解决方法
    在VS2017中连接到SQLite数据源(dbfist)
    Sqlite 的管理工具SQLite
    Navicat for mysql 免费破解工具+教程
    基于C#的机器学习--模糊逻辑-穿越障碍
    基于C#的机器学习--惩罚与奖励-强化学习
  • 原文地址:https://www.cnblogs.com/share23/p/9562541.html
Copyright © 2020-2023  润新知