Java的反射机制可以动态的加载类,实例化对象,动态的调用对象的方法等等。可以说Java的反射机制异常的强大。而且在很多的高级框架中都得到了应用。也可能说,Java的反射是高级框架功能实现的重要的一部分,所以,学好Java的反射机制对于我们高级框架的深入学习尤为重要。
Java中有的java.lang.Class对象代表Java应用程序运行时所加载的类或者接口的实例。Java中的每一个类都有一个java.lang.Class对象向对应。要获得java.lang.Class的对象有两种办法,直接通过类的.class来获得,或通过类实例例化出来的对象的getClass()方法获得。
//第一种
Class clazz=String.class;
//第二种
String str="work";
Class clazz1=str.getClass();
这样,我们就获得了String类的Class实例。有了Class实例,我们就可以对其相对应的类进行实例化对象,方法的调用,域的修改等操作。
我们还可以通过
Class.forName()方法来加载类,获得Class的实例。在写数据库的时候,我会都接触到,用它来加载数据库驱动类。forName()还有个重载的方法,除了传递一个类,还可以传递一个布尔型的值,如果为false,那么将不会初始化加载的类(一般用到它是因为类中的静态域的问题)。
我们还可以通过类的加载器,ClassLoader实例的
loadClass()方法来加载类。获得ClassLoader的方法:
ClassLoader loader=类名.class.getClassLoader();
下面我们对类的加载器进行下简要的分析:
每个类加载器再加载类之前,会先让父类加载器先加载,如果父类加载器找不到要加载的类,再交给自己来加载。Java中有3个类加载器,
BootstrapLoader,ExtClassLoader,AppClassLoader(SystemLoader)。他们会按照
BootstrapLoader -> ExtClassLoader -> AppClassLoader这个顺序去加载类,如果找不到类,则会丢出NotClassDefFoundError异常。用ClassLoader来加载类是,不会初始化类的静态区域,只有再真正使用到这个类的时候,才初始化静态区域。前面说过,每个类有一个Class的实例对象,但是,如果同一个类,被两个加载器都加载过,就会有两个Class的实例与它对应。
用反射生成对象,我们可以调用Class中的newInstance()方法来生成对象,例如
Class clazz=String.class;
//生成一个Object类型的对象
Object obj=clazz.newInstance();
生成的对象都是Object类型的。但是有一点要注意,用这种方法生成对象,类中必须有一个无参的构造器。另外,还有一种生成对象的办法,用java.lang.reflect.Constructor这个类来生成对象。用这种方法来生成对象可以不必有无参的构造器,我们以String类为例,用Constructor来实例化一个String类的对象,用其public String(String arg0)构造器为例子:
//获得String的Class实例
Class clazz=String.class;
//创建一个数组,这个数组用来放要实例化对象的构造器里的参数类型
Class[] param=new Class[1];
//放入构造器中的参数类型,如果有多个,按顺序放入
param[0]=String.class;
//实例化一个构造器对象,并把放着构造器参数类型的数组作为参数传进去
Constructor constructor=clazz.getConstructor(param);
//创建一个Object数组,用于放构造器中对应的值
Object[] obj=new Object[1];
//将值放入到数组中,这里要注意,param数组中放入的是什么类型,这里就要按顺序放入
obj[0]="zhang3";
//实例化对象,并把放着构造器要传入的参数的数组传到方法中
String str=(String)constructor.newInstance(obj)
这样,我们就通过java.lang.reflect.Constructor实例化出来了String类型的对象。
用反射调用方法,通过java.lang.reflect.Method类,我们来实现对方法的调用,代码如下:
//实例化一个方法的对象,arg0是方法名,arg1是方法的参数类型,要是多个就传数组
Method method=clazz.getMethod(arg0, arg1);
//方法的调用,arg0是有次方法的对象,arg1是传入方法中的值
method.invoke(arg0, arg1);
上面的两行代码是最主要的,下面我贴出一个完整例子的代码,对照的看下,马上就明白,假设有一个Student类,它有一个setName方法,方法参数类型为String:
Class clazz=Student.class;
Object obj=clazz.newInstance();
Class[] param={String.class};
Method method=clazz.getMethod("setName", param);
Object[] value={"zhang3"};
method.invoke(obj, value);
以上便是反射对方法的调用,基本上与实例化对象大同小异。
用反射修改域,通过java.lang.reflect.Field来实现,下面我直接贴出完整例子的代码,还是以Student类为例:
Class clazz=Student.class;
Object obj=clazz.newInstance();
//获得一个域的实例,getField()方法中的参数为域的名字
Field name=clazz.getField("name");
//*如果你的域修饰为private,那么必须调用setAccessible("true")才能对其修改
name.setAccessible("true");
//第一个参数是有此域的对象,第二个是值,这个方法是通用的,不管你的域类型是什么
name.set(obj, "zhang3");
Java的反射机制非常的强大,在这里我只是对其一些基本的功能如加载类,实例化对象,对类中方法的调用等功能进行了简单的讲解和分析。再后面,我还会对反射中的代理进行简要概述。
分享到:
相关推荐
java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者能够在运行时动态地获取类的信息(如类名、方法名、参数类型)并调用方法,创建对象,甚至...
JAVA反射机制应用 JAVA反射机制是JAVA语言中的一种动态机制,它能够在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。这种动态获取的信息以及动态...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...
Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...
### Java反射机制深入理解 #### 一、反射机制概述 Java反射机制是一种强大的工具,它允许程序在运行时检查和操作任何类、方法、构造函数和字段等元素。这种能力对于构建灵活的应用程序和框架非常有用,特别是那些...
Java反射机制是Java语言提供的一种强大工具,它允许在程序运行时动态地获取类的信息以及对类的对象进行操作。在Java中,静态编译时类型检查确保了代码的稳定性,但有时我们需要在运行时根据需求动态地创建对象、调用...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...
Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...
这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象等核心概念。在这里,我们将详细讨论Java反射的基本用法及其在实际开发中的应用。 1. **什么是反射**: ...
java反射机制和动态代理的原理,熟悉反射机制和动态代理
### Java反射机制详解 #### 一、Java反射机制概述 Java反射机制是Java语言的一个重要特性,它允许程序在运行时获取类的信息并操作对象。Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。这种机制使得Java具有高度的灵活性和动态性,可以在编译时未知类的情况下进行类的加载、实例化、方法调用等操作...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这个特性使得Java具备了高度的灵活性,能够在运行时动态地发现和使用类的属性和方法,即使这些信息在编译时...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法的信息,打破了通常编译时静态绑定的限制。通过反射,我们可以动态地创建对象,调用方法,访问和修改字段值,甚至...
### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射机制相关的题目。这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射...
java反射机制核心代码,小弟一直弄不明白,怎么通过反射来调用私有成员方法,看了这个后,你可以随心调用private方法,和属性,记得添加setAccessable(true),哦,要不还是不行,如:method.setAccessable(true);
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...