Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
Java反射机制主要提供下面几种用途:
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法
使用java的反射机制,一般需要遵循三步:
一、获得你想操作类的Class对象
二、通过第一步获得的Class对象去取得操作类的方法或是属性名
三、操作第二步取得的方法或是属性
Java运行的时候,某个类无论生成多少个对象,他们都会对应同一个Class对象,它表示正在运行程序中的类和接口。如何取得操作类的Class对象,常用的有三种方式:
调用Class的静态方法forName,如上例;
使用类的.class语法,如:Class cls = String.class;
调用对象的getClass方法,如:String str = "abc";Class cls = str .getClass();
一、获得想操作的类的对象:
首先创建 ReflectServiceImpl.java
package net.xrcloud.pojo;
public class ReflectServiceImpl {
public void sayHello(String name){
System.out.println("Hello"+name);
}
}
然后通过反射的方法去构建它
public ReflectServiceImpl getInstance(){
// 给类加载器注册一个类ReflectServiceImpl的全限定名然后通过newInstance的方法初始化了一个类对象
ReflectServiceImpl object = null;
try{
object = (ReflectServiceImpl) Class.forName("net.xrcloud.pojo.ReflectServiceImpl").newInstance();
}catch(Exception ex){
ex.printStackTrace();
}
return object;
}
上面的代码实现了一个构造方法没有任何参数的类的反射,下面看一下构造方法带有参数的类的反射
package net.xrcloud.pojo;
public class ReflectServiceImpl {
private String name;
public ReflectServiceImpl(String name){
this.name = name;
}
public void sayHello(String name){
System.out.println("Hello"+name);
}
}
通过反射生成带有参数的构造方法
public ReflectServiceImpl getInstance(){
// 给类加载器注册一个类ReflectServiceImpl的全限定名然后通过newInstance的方法初始化了一个类对象
ReflectServiceImpl object = null;
try{
object = (ReflectServiceImpl) Class.forName("net.xrcloud.pojo.ReflectServiceImpl").newInstance();
//通过getConstructor 方法,它的参数可以是多个,这里定义为String.class,意为有且只有一个参数类型为String 的构造方法。
//通过这个方法可以对重名方法进行排除,然后用newInstance 方法生成对象
getConstructor(String.class ).newInstance("明昊");
}catch(Exception ex){
ex.printStackTrace();
}
return object;
}
二、通过第一步获得的Class对象去取得操作类的方法
在使用类的方法之前要获取方法对象,得到了方法才能够去反射
public Object reflectMethod(){
Object returnObj = null;
ReflectServiceImpl target = new ReflectServiceImpl();
try{
//
Method method = ReflectServiceImpl.class.getMethod("sayHello",String.class);
ReturnObj = method.invoke(target,"明昊");
}catch(ex){
ex.printStackTrace();
}
return returnObj;
}
反射生成对象和反射调用方法
public Object reflect(){
ReflectServiceImpl object = null;
try {
object = (ReflectServiceImpl) Class.forName("net.xrcloud.pojo.ReflectServiceImpl").newInstance();
Method method = object.getClass().getMethod("sayHello", String.class);
method.invoke(object, "明昊");
}catch(Exception ex){
ex.printStackTrace();
}
return object;
}
这样就能反射对象和方法。