极悦注册教程:Java中的反射教程_极悦注册
专注Java教育14年 全国咨询/投诉热线:444-1124-454
极悦LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 极悦注册 极悦注册教程:Java中的反射教程

极悦注册教程:Java中的反射教程

更新时间:2019-12-17 16:35:24 来源:极悦 浏览2209次

 

极悦注册教程:Java中的反射教程

 

  反射是什么?

  Reflection的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

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

  为什么需要反射?

  Java反射在框架开发中尤为重要。有些情况下,我们要使用的类在运行时才会确定,这个时候我们不能在编译期就使用它,因此只能通过反射的形式来使用在运行时才存在的类(该类符合某种特定的规范,例如JDBC),这是反射用得比较多的场景。

  编译时我们对于类的内部信息不可知,必须得到运行时才能获取类的具体信息。比如ORM框架,在运行时才能够获取类中的各个属性,然后通过反射的形式获取其属性名和值,存入数据库。

  反射机制提供的功能:

  在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法。通过反射甚至可以调用到private的方法; 在运行时修改构造函数,变量和方法的访问权限。

  解耦

  假如我们有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码能否通过编译呢?这是不能通过编译的。利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译

  在对类的调用和实例化的时候,通过在配置文件中配置相应的类名,在程序中读取类名,然后通过反射技术在程序中加载和实例化,如常见的数据库驱动程序类,为了达到不依赖特定数据库驱动类,将用到的数据库驱动类名放到配置文件中(常用的有XML文件、Properties文件和文本文件),然后在程序中加载驱动,来实现对数据库的解耦,也就是说只要修改配置文件,就可以方便地更改数据库类型。

  例如, Spring使用如下的bean配置:

      image.png

  当Spring在处理时,会使用Class.forName(String),同时参数为"com.xxx.Foo"用于实例化这个Class。同时,使用反射设置去用于设置特定的值。

  这种机制同样也用于Servlet的web应用:   image.png

  反射API

  Java反射相关类

  Java反射所需要的类并不多,主要有java.lang.Class类java.lang.reflect包中的Field、Constructor、Method、Array类,简单说明如下所示:

  Class类:Class类的实例表示正在运行的Java应用程序中的类和接口。Field类:提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。这个类和Field类不同,Field类封装了反射类的属性,而Constructor类则封装了反射类的构造方法。Method类:提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。这个类不难理解,它是用来封装反射类方法的一个类。Array类:提供了动态创建数组和访问数组的静态方法。该类中的所有方法都是静态方法。

  Class

  类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生一个Class对象。

  Class没有公共构造方法。Class对象是在加载类时由Java虚拟机以及通过调用类加载器中的defineClass方法自动构造的,因此不能显式地声明一个Class对象

  Class是Reflection的起源。要想操纵;类的属性和方法,都必须从获取ClassObject开始。

  Class的方法

  getName():获得类的完整名字。getFields():获得类的public类型的属性。getDeclaredFields():获得类的所有属性。getMethods():获得类的public类型的方法。getDeclaredMethods():获得类的所有方法。getMethod(Stringname,Class[]parameterTypes):获得类的特定方法,name参数指定方法的名字,–parameterTypes参数指定方法的参数类型。getConstrutors():获得类的public类型的构造方法。getConstrutor(Class[]parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

  Constructor

  获得类的构造方法

  ConstructorgetConstructor(Class[]params)–获得使用特殊的参数类型的公共构造函数Constructor[]getConstructors()–获得类的所有公共构造函数ConstructorgetDeclaredConstructor(Class[]params)–获得使用特定参数类型的构造函数(与接入级别无关)Constructor[]getDeclaredConstructors()–获得类的所有构造函数(与接入级别无关)

  Field

  获取类定义变量

  FieldgetField(Stringname)–获得命名的公共字段Field[]getFields()–获得类的所有公共字段FieldgetDeclaredField(Stringname)–获得类声明的命名的字段Field[]getDeclaredFields()–获得类声明的所有字段

  Method

  获取类定义方法

  MethodgetMethod(Stringname,Class[]params)–使用特定的参数类型,获得命名的公共方法Method[]getMethods()–获得类的所有公共方法MethodgetDeclaredMethod(Stringname,Class[]params)–使用特写的参数类型,获得类声明的命名的方法Method[]getDeclaredMethods()–获得类声明的所有方法

 

极悦注册教程:Java中的反射教程

       以上就是极悦注册机构小编介绍的“极悦注册教程:Java中的反射教程”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

 

       Java全套自学资料

       Java自学视频教程(免费下载学习):

  Java技术教程:

  Spring视频教程(免费下载学习):

 

       相关文章

  

  

  

  

  

 

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>