Java反射reflect总结

反射

一 、 定义

        在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每一个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行。
        Java反射机制是在系统运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java的反射机制。
        要想解剖一个类,必须先要获取到该类的字节码文件对象。使用Class类中的方法,可以获取到每一个字节码文件对应的Class类型的对象。Class类的实例表示正在运行的Java应用程序中的类和接口,也就是jvm中有N多的实例每个类都会有该Class类所对应的对象。
        Class没有公共的构造方法,Class对象是在加载类时由java虚拟机以及通过调用类加载器中的defineClass方法自动构造的也就是这不需要我们自己创建Java虚拟机帮我们自动创建好。

二、 反射机制原理

        由于写的源代码是.java文件,通过javac编译后成为.class文件,即字节码文件,程序执行时,JVM会类加载字节码文件到内存,严格意义上说是加载到方法区,并转换成java.lang.Class对象,通过反射可以构建实例,得到成员变量的值,得到方法并调用。

三、 反射的作用及用途

(一) 反射的作用
        通过反射可以使程序代码访问装载到JVM中的类的内部信息。

1.         获取已装载类的成员变量信息

2.         获取已装载类的方法

3.         获取已装载类的构造方法信息

(二)反射的主要用途
      当我们在使用IDE(如Eclipse,IDEA)时,当我们输入一个对象或类并想调用它的属性或方法时,一按点号,编译器就会自动列出它的属性或方法,这里就会用到反射

        反射最重要的用途就是开发各种通用框架

        很多框架(比如Spring)都是配置化的,为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。

四、 反射的常用类和方法

(一)  Class类的常用方法


        一个 Class 可以被以下修饰符的一种或者多种修饰:
        访问权限控制符:public, protected, private
        抽象的、需要实现的:abstract
        限制只能有一个实例的:static
        不允许修改的:final

        1.  getName()
        一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
        2.  newInstance()
        创建对象实例,newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。
        3.  getClassLoader()
        返回该类的类加载器。
        4.  getSuperclass()
        返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
        5.  isArray()
        判定此 Class 对象是否表示一个数组类。
        6.  getMethod()
        根据方法名称和参数类型获取方法,String name, Class<?>... parameterTypes,方法参数可能有一个也可能有多个,由于java具有重载的特性,一个类中可能同时存在多个同名方法,所以参数类型必须指定。该方法可以获得类的公有方法,包括自身的所有public方法,和从基类继承的、从接口实现的所有public方法。
        7.  getDeclaredMethod()
获取的是类自身声明的所有方法,包含public、protected和private方法。


(二) method用法

1.  method.invoke()
用于执行方法,参数Object obj, Object... args,第一个是调用的对象,第二个是方法需要传入的参数,参数按顺序传入。
2.  getAnnotatedReturnType()
方法返回目标方法的返回类型的Type对象。如果目标方法被声明为返回void,则该方法返回void.class。
3.  getGenericParameterTypes()
该方法返回目标方法所有参数类型的Type对象数组,这些Type对象将按照参数的声明顺序存储于在数组中。如果目标方法没有任何参数,则该方法返回一个空数组。
4.  getParameters()
获取方法参数名称


(三) Field用法


1.  getType()
返回变量的类型
2.  getDeclaredField()
获取变量的值,此方法可以获得私有变量。注意:射获取或者修改一个变量的值时,编译器不会进行自动装/拆箱。
3.  getField()
获得公有public变量

五、 代码实现

1.  用反射操作来获取继承关系

2.  instanceof运算符来判断关系

3.访问字段(成员变量)

4.截取所有public方法(包括子类)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值