简介
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
反射基础
反射提供了一种动态的功能,这种动态功能非常的强大。它主要体现在通过反射相关的API,就可以知道一个陌生的java类的所有信息,包括属性,方法,构造器等。而且元素完全可以在运行时动态的进行创建或调用,而不必在JVM运行时就进行确定。
反射原理
严格意义上说,java并不是动态语言,它并没有Perl和Python那样的灵活多变。但是,java的反射机制却让它显得动态起来。
一般情况下,如果想生成这个类的对象时,运行这个程序的JVM会确认这个类的Class对象是否已经加载。如果尚未加载,JVM会根据类名查找class文件,并将其载入,一旦这个类的Class对象被载入内存,它就可以被用来创建这个类的所有对象。
另外,对于一个未知类型的引用来说,通常会采用强制类型转换的形式得到开发者想要的类型引用,如果执行了一个错误的类型转换,就会抛出一个ClassCastException异常。
在以上这两个过程中,Class类一直都在起作用。因为Class类实例包含的是一个Java类的全部信息,包括类名,方法,属性等。换句话说,也就是Class对象就是代表一个类的类。
Java用Class类来代表所有的类,方便了开发者掌控类信息。通过Class,开发者可以得到属性,方法,构造器,修饰符等信息。在动态的 获取这些信息以后,开发者就可以用该Class创建实例,调用任何方法,访问任何属性等操作,这些也是反射的主要用途。
反射机制相关的API主要集中在java.lang.reflect包下,开发者也就是利用该包下面的接口和类进行相关的反射开发的。大多数的框架,如struts,Hibernate,和Spring,都会频繁的使用反射API来完成他们的动态的功能。
反射是为了能够动态的加载一个类,动态的调用一个方法,动态的房屋内一个属性等动态要求而设计的。它的出发点就在于JVM会为每个类创建一个java.lang.Class类的实例,通过该对象可以获取这个类的信息,然后通过使用java.lang.reflect包下的API以达到各种动态需求。
class类含义与作用
Class类在反射机制中起到了非常关键的作用,它是开发者进行反射开发的入口。那应该如何获取一个类的Class对象呢?如何让一个类动态的加载到JVM中呢?
在前面的内容中,读者知道了Class是用来记录一个类的各种信息的,它伴随着类的加载而创建。那么,类会在什么时候加载到JVM中呢?概括的来说,一个普通的Java类,会在一下几种情况,被加载到JVM中。
(1)需要使用该类创建对象。如下代码就会导致Student类被加载到JVM中:
Student student = new Student();
(2)访问该类的静态成员。
System.out.println(Student.count).
(3)使用Class类的静态forName()方法,动态的加载一个指定类名的类。如果类未找到,则抛出ClassNotFoundException异常。
class.forName("com.test.student");
不管通过社么样的形式,类一旦被加载进入JVM以后,就会为它创建一个Class类的实例对象。那么,开发者又该如何得到这个Class对象呢?概括来说,要得到一个类的Class对象,可以通过以下几种途径。
(1)Class的forName()方法的返回值就是Class类型,也就是动态导入类的Class对象的引用。
(2)每个类都会有一个名称为Class的静态属性,通过它也是可以获取到Class对象的。
class<Student> clazz = Student.class;
(3)object类中有一个名为getClass的成员方法,它返回的是对象运行时类的Class对象。因为onject类是所有类的父类,所以,所有的对象都可以使用该方法得到它运行时类的Class对象。
Student stu = new Student();
Class<Student> clazz = stu.getClass();
获取到Class对象以后,就可以通过调用它的一些成员方法获取它所代表的类的属性,方法,修饰符等信息,以及调用newInstance()方法来创建新的实例对象。
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
Java反射机制Java反射机制Java反射机制Java反射机制
本文档对Java中使用最广的反射进行了深度而让人简单容易理解的解析,附有实例,可供致力于java底层研究的人提供借鉴
3.2 相关知识 3.2.1 Java反射机制的概念 3.2.2 反射机制的功能 3.2.3 Java反射机制的相关API 3.2.4 使用反射机制的步骤 3.2.5 反射机制的应用场景 3.2.6 反射机制的优缺点 Java高级程序设计实战教程第三章-Java反射...
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java...
java反射机制.docx
Java反射机制.doc
·课程中,Eclipse和IDEA这两种企业一线开发环境都使用到了 3.技术讲解更深入、更全面: ·课程共30天,715个知识视频小节,涉及主流Java使用的方方面面,全而不冗余 ·全程内容涵盖数据结构、设计模式、JVM内存...
粗浅看java反射机制编程开发技术共27页.pdf.zip
java-反射机制-源码
java中的反射机制的示例,反射在java的开发过程中是经常用到的,会使你的代码更灵活,更优秀.
Java 程序在运行期间可以动态加载、解析和使用一些在编译阶段并不确定的类型数据,这一机制被称为反射(Reflection)。反射库(reflection library)提供了一个非常丰富且精心设计的工具类,以便编写能够动态操纵Java...
Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象,无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。Java reflection 非常有用,它使类...
-JAVA反射机制.ppt
Java反射机制,了解java反射机制,掌握java软件开发的要领。
Java反射机制在数据持久层轻量级ORM框架中的应用研究.pdf
这本书从初学者的角度,以丰富的实例、案例,通俗易懂的语言,简单的图示,详细地介绍Java开发中用到的多种重点技术。全书分为23章,包括需要重点掌握的环境搭建、简单Java程序、Java基础程序设计、数组与方法、面向...
文章目录Java ReflectionJava反射机制提供的功能Java反射相关的主要APIjava.lang.Class类Class类的核心要点Class类的重要API实例实例化Class类对象(四种方法)创建类对象并获取类的完整结构获取Class对象后创建类的...
web开发学习的必备技术之一,软件开发的参考文档,熟能生巧,不久,自学者就能应用的得心应手,成为web开发的一位高手,也为网站制作爱好者的首选学习资料,专业,详细,全面,一份资料胜几分不够专业的资料文档,...
java的反射功能在实际开发应用当中用得很多,但很多人并不知道该怎么用,这里上传一帮助文档,希望对大家有所帮助。
010102_【第1章:JAVA概述及开发环境搭建】_Java开发环境搭建笔记.pdf 010201_【第2章:简单Java程序】_简单Java程序笔记.pdf 010301_【第3章:Java基础程序设计】_Java数据类型笔记.pdf 010302_【第3章:Java基础...