Java反射

来源:互联网 发布:windows视频录制软件 编辑:程序博客网 时间:2024/06/07 14:53

反射

  • 概念
    • 定义:程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义
    • 理解:在程序运行期,动态加载类文件,并能探知类的基本结构,能够创建类的对象,访问属性和方法等
    • 反射的优缺点
      • 优点:
        • 运行期类型的判断
        • 动态类加载,所以使用反射能,工厂模式 动态代理 sping等框架
        • 反射提高了程序的灵活性和拓展性,降低耦合性,提高自适应能力
      • 缺点:
        • 性能问题,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多
        • 会模糊程序内部逻辑,且不容易维护
        • 利用反射可以访问任何的对象,和JAVA的安全机制有冲突,如:一些private修饰的属性和方法,本意是只在对象内部调用和访问的,但是通过反射在外部也可以访问,这严重破坏了安全机制。
    • 反射的功能
      • 在运行时判断任意一个对象所属的类
      • 在运行时构造任意一个类的对象
      • 在运行时判断任意一个类所具有的成员变量和方法
      • 在运行时调用任意一个对象的方法
      • 生成动态代理
    • 反射使用
      • 反射:获得Class类
      • 反射:获得构造器
      • 反射:获得类的实例
      • 反射:获得成员方法
      • 反射:获得成员属性

获得Class类

三种选择

  • 如果已经有一个类的实例,即存在已知对象
    • 对象。getclass()方法
  • 如果你在编译期知道类的名字:类的属性加载
    • 类名。class
  • 如果类名在编译期不知道, 但是在运行期可以获得, 你可以使用下面的方法:Class类的forName方
    • Class。forName(String),传入类的全限定路径
    • 请注意,forName方法会将类文件加载进JVM,所以此类的静态属性会加载,静态代码快会执行

获得构造器

Constructor getConstructor(Class[] params) – 获得使用特殊的参数类型的公共构造函数,

Constructor[] getConstructors() – 获得类的所有公共构造函数

Constructor getDeclaredConstructor(Class[] params) – 获得使用特定参数类型的构造函数(与接入级别无关)

Constructor[] getDeclaredConstructors() – 获得类的所有构造函数(与接入级别无关)

获得类的实例化对象

  • Class类的newInstance方法
    • 此类必须有空构造才能创建实例,否在抛异常
    • 空构造器的权限修饰附必须是public,否则抛异常
  • Constructor类的newInstance方法
    • 此方法可以传参数,所以可以利用空构造器,也可以用带参构造创建对象
    • 相应构造方法存在,且权限修饰附为public

获得类中的方法

Field getField(String name) – 获得命名的公共字段

Field[] getFields() – 获得类的所有公共字段

Field getDeclaredField(String name) – 获得类声明的命名的字段

Field[] getDeclaredFields() – 获得类声明的所有字段

获得类中的属性

Method getMethod(String name, Class[] params) – 使用特定的参数类型,获得命名的公共方法

Method[] getMethods() – 获得类的所有公共方法

Method getDeclaredMethod(String name, Class[] params) – 使用特写的参数类型,获得类声明的命名的方法

Method[] getDeclaredMethods() – 获得类声明的所有方法

Class类

  • 概述
    • Class‘<’T‘>’: T - 由此 Class 对象建模的类的类型,如果将被建模的类未知,则使用 Class“<“?”>”
    • 表示类的类,描述类的内部结构的
  • 方法:
    带declared是获取所有的
    不带是获取公共访问的
    • 获取构造器Constructor
    • 获取属性Field
    • 获取方法Method
    • asSubclass(Class) :强制转换以表示指定类对象的子类的class
    • cast(Object obj) :转换为Object的类型的class
    • 获得注解
      • getAnnotation(Class annotationClass) :获取指定注解
      • getAnnotations() :获得所有的注解
      • getDeclaredAnnotations() :获取直接写在此类上注解,继承的注解不要
  • 内部类有关

    • getClasses() :获取此类的公共访问的内部类
    • getDeclaredClasses() :返回所有内部类
    • getDeclaringClass() ::如果此类是某个类的内部类,则返回此类的外部类
  • 获取父接口

    • getInterfaces():获取所有的接口
    • getGenericInterfaces() :直接父接口
    • getGenericSuperclass() :所有的超类,包括类和接口
  • 获取父类
    • getSuperclass()
    • 获取类的修饰符
  • getModifiers() :int类型表示的修饰符
  • getName() :获取名称,全限定路径
  • getPackage() :获取包
  • getClassLoader() :获取类加载器
  • getResource(String name) :获取指定名称所指定的资源,URL
  • getResourceAsStream(String name) :获取指定名称文件的输入流,InputStream
  • newInstance() :创建类的实例化对象
  • isXXX:确认是否某类型的类,重载方法

Constructor类

  • 概述
    • 提供关于类的单个构造方法的信息以及对它的访问权限
  • 方法
  • 获取注解
    • getAnnotation(annotationClass) :指定类型注解
    • getDeclaredAnnotations() :直接注解
  • 获取类Class
    • getDeclaringClass() :获取此构造器的类
  • 获取修饰符
    • getModifiers() :int类型表示的修饰符
  • 创建对象
    • newInstance(Object… initargs) :带参构造的实例化对象
  • 获取构造器参数类型
    • getGenericParameterTypes() :参数类型
    • getParameterTypes() :参数类型
    • getParameterAnnotations() :参数的注解

Method

  • 概述
    • 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)
  • 方法
  • 获取注解
    • getAnnotation(Class annotationClass) :指定注解
    • getDeclaredAnnotations() :直接注解
  • 获取Class类
    • getDeclaringClass() :此方法Method的Class类
  • 获取此方法注解的默认值
    • getDefaultValue() :方法注解的默认值
  • 获取异常类型
    • getExceptionTypes() :方法的异常
  • 获取参数类型
    • getParameterTypes() :参数列表类型
    • getParameterAnnotations() :参数列表的注解,返回二维数组 Annotation[][]
  • 获取返回值类型
    • getReturnType() :返回值类型
  • 获取修饰符
    • getModifiers() :int类型表示的修饰符
  • 方法调用

    • invoke(Object obj, Object… args) :调用obj对象的此method表示的带参的方法

    • -
原创粉丝点击