java的反射原理

转载 2016年06月01日 09:09:20
一、预先需要掌握的知识(java虚拟机) 

java虚拟机的方法区: 

java虚拟机有一个运行时数据区,这个数据区又被分为方法区,堆区和栈区,我们这里需要了解的主要是方法区。方法区的主要作用是存储被装载的类的类型信息,当java虚拟机装载某个类型的时候,需要类装载器定位相应的class文件,然后将其读入到java虚拟机中,紧接着虚拟机提取class中的类型信息,将这些信息存储到方法区中。这些信息主要包括: 

1、这个类型的全限定名 
2、这个类型的直接超类的全限定名 
3、这个类型是类类型还是接口类型 
4、这个类型的访问修饰符 
5、任何直接超接口的全限定名的有序列表 
6、该类型的常量池 
7、字段信息 
8、方法信息 
9、除了常量以外的所有类变量 
10、一个到class类的引用 
等等(读者可以参考《深入java虚拟机》这本书的叙述) 

Class类: 

Class类是一个非常重要的java基础类,每当装载一个新的类型的时候,java虚拟机都会在java堆中创建一个对应于新类型的Class实例,该实例就代表此类型,通过该Class实例我们就可以访问该类型的基本信息。上面说到在方法区中会存储某个被装载类的类型信息,我们就可以通过Class实例来访问这些信息。比如,对于上面说到的信息Class中都有对应的方法,如下: 

1、getName();这个类型的全限定名 
2、getSuperClass();这个类型的直接超类的全限定名 
3、isInterface();这个类型是类类型还是接口类型 
4、getTypeParamters();这个类型的访问修饰符 
5、getInterfaces();任何直接超接口的全限定名的有序列表 
6、getFields();字段信息 
7、getMethods();方法信息 

等等(读者可以自己参看jdk帮助文档,得到更多的信息) 

二、java反射详解 

反射的概念:所谓的反射就是java语言在运行时拥有一项自观的能力,反射使您的程序代码能够得到装载到JVM中的类的内部信息,允许您执行程序时才得到需要类的内部信息,而不是在编写代码的时候就必须要知道所需类的内部信息,这使反射成为构建灵活的应用的主要工具。 

反射的常用类和函数:Java反射机制的实现要借助于4个类:Class,Constructor,Field,Method;其中class代表的是类对象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象,通过这四个对象我们可以粗略的看到一个类的各个组成部分。其中最核心的就是Class类,它是实现反射的基础,它包含的方法我们在第一部分已经进行了基本的阐述。应用反射时我们最关心的一般是一个类的构造器、属性和方法,下面我们主要介绍Class类中针对这三个元素的方法: 

1、得到构造器的方法 

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

2、获得字段信息的方法 

Field getField(String name) -- 获得命名的公共字段 
Field[] getFields() -- 获得类的所有公共字段 
Field getDeclaredField(String name) -- 获得类声明的命名的字段 

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

 

3、获得方法信息的方法 

Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法 
Method[] getMethods() -- 获得类的所有公共方法 
Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法 
Method[] getDeclaredMethods() -- 获得类声明的所有方法 

应用反射的基本步骤: 

1、获得你想操作的类的Class对象; 

     方法一:Class c=Class.forName("java.lang.String") 
     方法二:对于基本数据类型可以用形如Class c=int.class或Class c=Integer.TYPE的语句 
     方法三:Class c=MyClass.class 

2、调用Class中的方法得到你想得到的信息集合,如调用getDeclaredFields()方法得到类的所有属性; 

3、处理第2步中得到的信息,然后进行你想做的实际操作。 


三、java反射的应用(Hibernate) 

我们在第二部分中对java反射进行了比较系统的阐述,下面我们就来讨论一下java反射的具体应用。前面我们已经知道,Java反射机制提供了一种动态链接程序组件的多功能方法,它允许程序创建和控制任何类的对象(根据安全性限制)之前,无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。例如,反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用。下面我们就已Hibernate框架为例像大家阐述一下反射的重要意义。 

Hibernate是一个屏蔽了JDBC,实现了ORM的java框架,利用该框架我们可以抛弃掉繁琐的sql语句而是利用Hibernate中Session类的save()方法直接将某个类的对象存到数据库中,也就是所涉及到sql语句的那些代码Hibernate帮我们做了。这时候就出现了一个问题,Hibernate怎样知道他要存的某个对象都有什么属性呢?这些属性都是什么类型呢?如此,它在向数据库中存储该对象属性时的sql语句该怎么构造呢?解决这个问题的利器就是我们的java反射! 

下面我们以一个例子来进行阐述,比如我们定义了一个User类,这个User类中有20个属性和这些属性的get和set方法,相应的在数据库中有一个User表,这个User表中对应着20个字段。假设我们从User表中提取了一条记录,现在需要将这条记录的20个字段的内容分别赋给一个User对象myUser的20个属性,而Hibernate框架在编译的时候并不知道这个User类,他无法直接调用myUser.getXXX或者myUser.setXXX方法,此时就用到了反射,具体处理过程如下: 

1、根据查询条件构造PreparedStament语句,该语句返回20个字段的值; 
2、Hibernate通过读取配置文件得到User类的属性列表list(是一个String数组)以及这些属性的类型; 
3、创建myUser所属类的Class对象c;c=myUser.getClass(); 
4、构造一个for循环,循环的次数为list列表的长度; 

     4.1、读取list[i]的值,然后构造对应该属性的set方法; 
     4.2、判断list[i]的类型XXX,调用PreparedStament语句中的getXXX(i),进而得到i出字段的值; 
     4.3、将4.2中得到的值作为4.1中得到的set方法的参数,这样就完成了一个字段像一个属性的赋值,如此循环即可; 

看到了吧,这就是反射的功劳,如果没有反射很难想象如果完成同样的功能会有多么难!但是反射也有缺点,比如性能比较低、安全性比较复杂等,这里就不在讨论这些东西,感兴趣的读者可以在网上找到答案,有很多的!

浅析Java中的反射机制原理

反射反射,程序员的快乐!        Java中反射机制使用的还是比较广泛的,系统的灵活性、可扩展性大都都是通过反射等方式来加载外部插件,使得系统与插件解耦的同时,增加了功能。但是很多人都只是会用,...
  • xiaoxian8023
  • xiaoxian8023
  • 2013年06月25日 11:33
  • 38043

Java反射原理分析

一:Java的反射就是把Java类中的各种成分映射成相应的Java类。 例如:一个Java类中用一个Class类的对象来表示此Java类中的组成部分:成员变量,方法,构造方法,包等信息也用一个个的J...
  • u010366796
  • u010366796
  • 2015年03月07日 18:45
  • 951

Java反射机制实现与原理

本文介绍Android反射机制实现与原理,在介绍之前,要和Java进行比较,所以先看下Java中的反射相关知识: 一、反射的概念及在Java中的类反射   反射主要是指程序可以访问、检测和修改它本...
  • A__yes
  • A__yes
  • 2016年05月14日 22:10
  • 2282

这是转载的 java反射机制与原理,原作者讲解的相对很通俗易懂

转自这里 Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框架技术有很大的帮助。 那么什么是Java的反射呢?    ...
  • le_le_name
  • le_le_name
  • 2016年08月27日 21:22
  • 3130

Java反射机制的原理与简单使用

一、 原理     简单的来说,反射机制其实就是指程序在运行的时候能够获取自身的信息。如果知道一个类的名称/或者它的一个实例对象, 就能把这个类的所有方法和变量的信息(方法名,变量名,方法,修饰...
  • superguy2014
  • superguy2014
  • 2016年08月17日 15:11
  • 316

Java反射机制的原理与使用(反编译)

一、 原理     简单的来说,反射机制其实就是指程序在运行的时候能够获取自身的信息。如果知道一个类的名称/或者它的一个实例对象, 就能把这个类的所有方法和变量的信息(方法名,变量名,方法,修饰符,类...
  • u011631266
  • u011631266
  • 2014年02月16日 22:20
  • 2239

Spring IOC原理之Java反射机制

1、反射概念以及为什么要使用反射 我们考虑一个场景,如果我们在程序运行时,一个对象想要检视自己所拥有的成员属性,该如何操作? 那再考虑这样另一个场景,如果我们想要在运行期获得某个类Class的信息如它...
  • zhangliangzi
  • zhangliangzi
  • 2016年03月26日 10:17
  • 9680

内省 + 反射(简单应用实现原理)

当我们需要封装从页面传递到后台的请求参数时,简单的方式就是使用一个工具类帮我们封装,省很多力气,还不容易出错。那接下来就简单介绍下这个BeanUtils工具类的实现原理,顺便重温下java内省机制。 ...
  • java__project
  • java__project
  • 2016年12月24日 22:55
  • 503

Java反射机制的适用场景及其利与弊

Java反射机制的适用场景及其利与弊   一、反射的适用场景是什么? 1).Java的反射机制在做基础框架的时候非常有用,有一句话这么说来着:反射机制是很多Java框架的基石。而一般应用层面很少...
  • zolalad
  • zolalad
  • 2014年06月08日 16:13
  • 7977

Android反射机制实现与原理

本文介绍Android反射机制实现与原理,在介绍之前,要和Java进行比较,所以先看下Java中的反射相关知识: 一、反射的概念及在Java中的类反射   反射主要是指程序可以访问、检...
  • u014386544
  • u014386544
  • 2016年09月12日 14:24
  • 1780
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java的反射原理
举报原因:
原因补充:

(最多只允许输入30个字)