初识JAVA--反射

初识JAVA--反射

  • 背景知识
  • 反射
    • 反射机制
    • 常用方法
  • 反射的主要功能

背景知识

  • 一个类存在其类对象
    Person类,存在一个Person.class的类对象
    

反射

  • 可以根据类名、对象,反向获取类信息

反射机制

组成

  • 获取类对象和相关信息:Class
  • 获取类对象中的方法:Method
  • 获取类对象中的属性:Field

功能

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法
  • 生成动态代理

获取Class对象的方式

  • 对象.getClass()
    Class cls= "哈哈".getClass();//cls = java.lang.String
    
  • 类名.class
    Class cls2=String.class;//cls = java.lang.String
    
  • Class.forName(“包名+类名”); 权限命名 —推荐
    Class cls3=Class.forName("java.lang.String");
    
  • 通过子类的Class对象获取到其父类的Class对象
    Class obj=cls.getSuperclass();
    

基本数据类型的类对象

  • int型
    • 需要注意,TYPE是Integer中的静态常量,api中已经写明它表示的是基本数据类型int的class实例
    • Integer.class表示引用数据类型Integer的class对象,与int型的类独享int.class不等
    System.out.println(int.class==Integer.TYPE);//结果为true
    System.out.println(int.class==Integer.class);//结果为false
    

常用方法

获取类信息

  • getName():获取类的全名
  • getSimpleName():获取类名
  • isPrimitive():判断是否为原始类型
  • getPackage():获取该类的存放路径,返回值为Package对象
  • getSuperclass():获取继承的类,返回值为Class对象
  • getInterfaces():获取接口,返回值为Class型数组

获取属性信息

  • getFields():获得类的public类型的属性,返回值为Field型数组
  • getFields(String name):获得类的public类型的指定属性,返回值为Field型对象
  • getDeclaredFields():获得类的所有属性,包括private声明的和继承类,返回值为Field型对象数组
  • getDeclaredField():获得类的所有属性,包括private声明的和继承类,返回值为Field型对象

获取方法信息

  • getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
  • getMethods():获得类的public类型的方法。
  • getDeclaredMethod():获得类的指定方法。包括private 声明的和继承类
  • getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类

获取构造器信息和创建实例

  • getConstructors():获得类的public类型的构造方法。
  • getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。(ex:int.class)
  • newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

反射的主要功能

  • 公共方法

    • 设置权限,操作构造器、属性、方法的权限
      • 构造器/方法/属性对象.setAccessible(参数)
        • true:打开权限
        • false:关闭权限
  • 反射操作构造器

    功能 方法名 参数 返回值
    取单个公共构造器 getConstructor() 构造器参数的参数类型 单个构造器
    公共构造器数组 getConstructors() - 构造器数组
    取单个任意权限构造器 getDeclaredConstructor() 构造器参数的参数类型 单个构造器
    任意权限构造器数组 getDeclaredConstructors() - 构造器数组
  • 创建对象

    • 获取到了构造器之后,再调用newInstance(形参列表)方法创建对象
    • 指定class对象的newInstance()方法,只能调用对应类的空构造器,如果没有则报错
  • 反射操作属性

    • 同上文,有四种,分别可以获取公共的属性和其数组,全部的属性和其数组
  • 反射操作方法

    • 同上文,有四种,分别可以获取公共的方法和其数组,全部的方法和其数组
    • 获取到指定的方法后,使用该方法执行获取到的方法
      method.invoke(Object obj, Object... args) 
      

你可能感兴趣的:(初识JAVA)