论文导读:反射的引入反射(Reflection)的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。可是这种实例化对象的方法存在一个问题,就是必须要知道类名才可以实例化它的对象,这样我们在应用方面就会受到限制。◆Field类:代表类的成员变量(成员变量也称为类的属性)。◆Array类:提供了动态创建数组,以及访问数组元素的静态方法。2)利用Class对象的getConstructor()方法获取指定的构造器(准备一个Class[]作为该方法的参数类型)。
关键词:反射,构造器,属性,方法,数组
一、引言1:反射的引入反射(Reflection)的概念是由Smith 在1982 年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp 和面向对象方面取得了成绩。其中LEAD/LEAD++、Open C++和Open Java 等就是基于反射机制的语言。
自从1995 年问世以来,Java 一直以其面向对象的,可移植的,多线程的和动态的特点而著称,并得到了广泛的应用。严格来讲,java 并不能算纯粹的动态语言,但是Java 有着一个非常突出的动态相关机制:反射(Reflection)。在Java 中我们可以于运行时加载、发现、使用编译期间完全未知的classes。换句话说,Java 程序可以加载一个运行时才得知名称的class,得到其完整构造(但不包括methods 定义),并生成其对象实体,或对其fields 设值;或调用其methods。
我们可以通过以下语句对反射有一个更清楚的认识。“Person p=new Person();”这是什么?当然是实例化一个对象了。可是这种实例化对象的方法存在一个问题,就是必须要知道类名才可以实例化它的对象,这样我们在应用方面就会受到限制。那么有没有这样一种方式,让我们不知道这个类的类名就可以实例化它的对象呢?有,可以采用反射技术来实现。
2:反射的主要接口和类在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包。
◆Class类:代表一个类。
◆Field类:代表类的成员变量(成员变量也称为类的属性)。免费论文网。
◆Method类:代表类的方法。
◆Constructor类:代表类的构造方法。
◆Array类:提供了动态创建数组,以及访问数组元素的静态方法。
二、反射的入口:Class类JAVA 中的类反射就是一个在当前JVM 中支持类、接口和对象内省的小型的、类型安全的和可靠的API。它是通过java.1ang.reflect 包提供的, 可以对类的能力进行分析。反射使程序代码能够访问装载到JVM 中的类的内部信息, 主要包括获取已装载类的字段、方法和构造函数的信息, 允许编写处理类的代码, 这些类是在程序运行时临时确定的, 而非源代码中事先选定的。这使反射成为构建灵活的应用的主要工具。
1. Class类 Java 中的“Class”类是Java 中一个十分特殊的类。它和其它类一样继承自“Object”类, 其对象用以表达Java程序运行时的类和接口。当一个类被加载时, JVM便自动产生一个类对象。
在java.lang.Object类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。免费论文网。Class类是Reflection API中的核心类,它有以下方法。
◆getName():获得类的完整名字。
◆getFields():获得类的public类型的属性。
◆getDeclaredFields():获得类的所有属性。
◆getMethods():获得类的public类型的方法。
◆getDeclaredMethods():获得类的所有方法。
◆getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。
◆getConstrutors():获得类的public类型的构造方法。
◆getConstrutor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。
◆newInstance():通过类的不带参数的构造方法创建这个类的一个对象。、
“Class”是Java 反射机制的起源。针对任何想探查的类, 只有先为它产生一个“Class”对象,接下来才能由这个“Class”对象调用为数十多个的反射APIs。因此, 利用反射APIs 动态访问某个类要经过以下三个步骤:
(1)创建一个“Class”对象;
(2)利用创建的“Class”对象获得类的内部信息;
(3)利用java.1ang.reflect 包的反射APIs, 动态处理上一步获得的类的内部信息。
2. Class类举例 public static voidmain(String[] args) throws Exception {
//1、 取得某一个类的Class实例,包含着该类的元数据,有三种方法
//Class<?> clazz = String.class; //方法1
//Class clazz='abc'.getClass(); //方法2
Classclazz = Class.forName('java.lang.String');// 方法3
//2、1从Class中取出对应类的全部字段,并输出其信息
Fieldfields[] = clazz.getDeclaredFields();
for(Field field : fields)
System.out.println(field.getName()+ field.getType());
//2、2从Class中取出对应类的某个字段,并输出其信息
Fieldfield = clazz.getDeclaredField('count');
System.out.println(field.getName()+ field.getType());
//3、1从Class中取出对应类的全部方法,并输出其信息
1/3 1 2 3 下一页 尾页 |