Java-Reflect

Java-Reflect 专题

参考慕课课程:反射——Java高级开发必须懂的

第1章 Class类的使用

1.1 基本概念

java的反射机制:

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

什么是类

  • 具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。
  • 类是对象的模版,对象是类的实例
  • 但是 类也是对象 类是java.lang.Class类的实例对象

类类型

Class Class< T >
T - the type of the class modeled by this Class object. For example, the type of String.class is Class. Use Class<?> if the class being modeled is unknown

1.2 Class类的使用
  1. 类是对象,任何一个类都是java.lang.Class的实例对象,这个实例对象有三种获取方式
  • Class c1 = Fool.class; //实际告诉我们任何一个类都有一个隐含的静态成员变量class
    
  • Class c2 = fool.getClass();//已知该类的对象,通过getClass方法
    
  • Class c3 = Class.forName("com.imooc.reflect.Fool");
    
  1. 官网上把 c1 or c2 叫做 Fool类的类类型(class type),一个类只可能是Class类的一个实例对象

  2. 可以通过类的类类型创建该类的实例,需要有无参的构造方法

     Fool fool1 = (Fool) c1.newInstance();
    

第2章 动态加载类

2.1 Java 动态加载类
  • Class.forName(“类的全称”),不仅表示了类的类类型,还代表了动态加载类
  • 编译时刻加载是静态加载了、运行时刻加载是动态加载类
  • new 创建对象时静态加载类,在编译时刻就需要加载所有的可能使用到的类
  • 反射的操作都是编译以后的操作

第3章 获取方法信息

3.1 Java 获取方法的信息
  • 基本类类型,void的关键字都存在类类型

  • 万物皆对象,Method 是方法对象,任何一个方法都是Method对象的实例

  • 通过反射获取类方法信息的基本步骤

    1. 通过以上三种方式获取该类的类类型,即Class类的实例
    2. 通过Class类提供的方法,获取该类类型的名字,方法,方法参数
  •   /*
       * Method类,方法对象
       * 一个成员方法就是一个Method对象
       * Class类的方法
       * 1.getMethods()方法获取的是所有public的函数,包括从父类继承而来的
       * 2.getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
       */
    

第4章 获取成员变量和构造函数信息

4.1 Java 获取成员变量和构造函数信息
  •  /**
     * 成员变量也是对象
     * java.lang.reflect.Field
     * Field类封装了关于成员变量的操作
     * Class类的方法
     * 1.getFields()方法获取的是所有public的成员变量的信息
     * 2.getDeclaredFields()方法获取的是该类自己声明的成员变量的信息
     */
    
  • /**
    * 构造函数也是对象
    * java.lang.Constructor
    * Class类的方法
    * 1.getConstructors()获取所有public的构造函数
    * 2.getDeclaredConstructors()获取改了所有自己声明的构造函数
    */
    

小结:获取类信息

  1. 获取该类的类类型,万物皆对象。

  2. 通过类类型获取所需类的信息的实例,Class类提供了大量的方法,可以获取类信息的实例

  3. 通过类信息实例的方法,进一步获取信息

第5章 方法反射的基本操作

5.1 Java 方法反射的基本操作
  • Q1: 如何获取某个方法?

    方法的名称和方法的参数列表才能唯一确定某个方法

  • Q2: 方法反射的操作?

    method.invoke(该对象的实例,方法的参数列表)

  • Q3: 为什么要用方法的反射?

    指定方法名称调用方法

    举个应用的案例 ------>通过标准的JavaBean的属性名获取其属性值

举例:获取A类的 print(int,int)方法步骤
类A定义如下:

class A {
    public int print(int x,int y){
      return x+y;
    }
}
  1. 首先要获取类的类类型

    A a1 = new A();
    Class c = a1.getClass();
    
  2. 获取方法—>名称和参数列表来决定

    Method m = c.getMethod("print", int.class, int.class);
    
  3. 方法的反射操作
    方法的反射操作是用m对象来进行方法的调用,和a1.print调用的效果一样
    方法如果没有返回值返回null,有返回值返回具体的返回值

    m.invoke(a1,10,20);
    

第6章 通过反射了解集合泛型的本质

6.1 Java 通过反射了解集合泛型的本质
  • 通过Class,Method来认识泛型的本质

  • 反射操作都是编译之后的操作

  • Java中集合的泛型,是防止错误的输入的,只有在编译阶段有效, 绕过编译就无效了

  • 验证:我们可以通过方法的反射来操作,绕过编译

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值