• Java中的反射


    一:反射的概述

      反射是框架设计的灵魂,使用前必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)。

      JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性,方法和构造函数;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    二:反射的入口:java.lang.Class

    日常开发中的对象,分为两种,基本类型和引用类型:

    • 基本类型,(固定的 8 种) 
      • 整数:byte, short, int, long
      • 小数:float, double
      • 字符:char
      • 布尔值:boolean
    • 引用类型 
      • 所有的引用类型都继承自 java.lang.Object
      • 类,枚举,数组,接口都是引用类型
      • java.io.Serializable 接口,基本类型的包装类(比如 java.lang.Double)也是引用类型

    对每一种对象,JVM 都会实例化一个 java.lang.Class 的实例,java.lang.Class 为我们提供了在运行时访问对象的属性和类型信息的能力。Class 还提供了创建新的类和对象的能力。最重要的是,Class 是调用其他反射 API 的入口,我们必须先获得一个 Class 实例才可以进行接下来的操作。

    (1)、一个类里都有什么

     类名、类修饰符、包信息、父类、实现的接口、属性、方法、构造器(构造方法)、注解多部分组成。

    (2)、属性有几部分组成

     修饰符、类型、属性名、属性值四部分组成。

    (3)、方法有几部分组成
     
     修饰符、返回类型、方法名、参数列表、方法体、返回值

    (4)、构造器几部分组成
     
     修饰符、构造器名称(类名)、参数列表、方法体

    三:获得入口:java.lang.Class

    1.Object.getClass 方法

    如果我们已经拿到了一个对象,可以很方便地使用它的 getClass 方法获得一个 Class 对象(当然这仅限于引用类型的对象):

    Class strClass = "String".getClass();

      返回的对象 strClass是 String 类型。

    2. .class 语法

      如果我们当前没有某个类的对象,无法使用 getClass() 方法,那还可以使用另外一种方法获取 Class:在要获得的类名后加上 .class ,比如这样:

    Integer.class.newInstance();
    int.class.newInstance();

    可以看到,这种方式不仅能用于引用类型,基本类型也可以。

    3.Class.forName()

      如果我们有一个类的完整路径,就可以使用 Class.forName(“类完整的路径”) 来得到相应的 Class,这个方法只能用于引用类型,比如:

    Class<?> c = Class.forName("java.lang.String");
    Class<?> aClass = Class.forName("com.ws.learn.Test");

    4. 所有方法一览

    四:从Class中获取成员信息

    java.lang.reflect.Member 是一个接口,代表 Class 的成员,每个成员都有类型,分为是否从父类继承,还有是否可以直接访问。

    Member 有三个实现类:

    • java.lang.reflect.Constructor:表示该 Class 的构造函数
    • java.lang.reflect.Field:表示该 Class 的成员变量
    • java.lang.reflect.Method:表示该 Class 的成员方法

     

    获取构造函数

    java.lang.Class 提供了以下方法用于获取该类的构造函数:

    shixinzhang

    注意:构造函数无法从父类继承

    Constructor getConstructor(Class[] params)根据构造函数的参数,返回一个具体的具有public属性的构造函数
    
    Constructor getConstructors()     返回所有具有public属性的构造函数数组
    
    Constructor getDeclaredConstructor(Class[] params)     根据构造函数的参数,返回一个具体的构造函数(不分public和非public属性)
    
    Constructor getDeclaredConstructors()    返回该类中所有的构造函数数组(不分public和非public属性)

    获取成员变量

    java.lang.Class 提供了以下方法用于获取该类的成员变量:

    shixinzhang

    Field getField(String name)  根据变量名,返回一个具体的具有public属性的成员变量
    
    Field[] getFields()  返回具有public属性的成员变量的数组
    
    Field getDeclaredField(String name) 根据变量名,返回一个成员变量(不分public和非public属性)
    
    Field[] getDelcaredFields() 返回所有成员变量组成的数组(不分public和非public属性)

    获取成员方法

    java.lang.Class 提供了以下方法用于获取该类的成员方法:

    shixinzhang

    Method getMethod(String name, Class[] params) 根据方法名和参数,返回一个具体的具有public属性的方法
    
    Method[] getMethods() 返回所有具有public属性的方法数组
    
    Method getDeclaredMethod(String name, Class[] params)  根据方法名和参数,返回一个具体的方法(不分public和非public属性)
    
    Method[] getDeclaredMethods() 返回该类中的所有的方法数组(不分public和非public属性)
  • 相关阅读:
    测试精进之路
    访问Apache服务器自动跳转到https协议
    如何安装Chrome OS系统
    遇到Project Target Framework Not Installed解决方法
    2019开发者调查结果和总结
    「工具神器」推荐一个扒网页的神器
    Linux 使用Unzip提示write error (disk full?). Continue? (y/n/^C)的解决方法
    安卓编译Failed to authenticate Jack server certificate错误问题解决办法
    如何手动给APK文件签名
    如何给个人网站添加免费的SSL
  • 原文地址:https://www.cnblogs.com/fdzfd/p/8818192.html
Copyright © 2020-2023  润新知