-------android培训、java培训、期待与您交流! ----------
初步了解了反射技术的原理以及作用,今天来研究一下Java中反射技术的主要应用。反射机制的主要作用是在运行时状态中,对于给定的一个类都可以获取到该类的属性和方法;对于任意的一个对象都可以获取到其属性值和调用其方法执行某些功能。因此,反射机制的主要应用包括以下几个方面:
1、可以再不确定类名的情况下,在运行时状态下动态的去创建需要类型的对象,并可对对象设置信息和执行功能。
Class cls=Class.forName(className);
//可以直接通过Class的newInstance方法创建对象,注意此时只能调用不带参数的构造函数
Object obj=cls.newInstance();
//带参数的构造函数,创建对象
Class[] paraType=new Class[]{p1Class,p2Class};//p1Class,p2Class分别对应于构造方法中的两个参数类型的Class对象
Constructor con=cls.getConstructor(paraType);
Object obj1=con.newInstance(p1,p2);//p1,p2为实际传递给构造函数的数据
2、反射技术大量用于Java设计模式和框架技术,例如在软件设计阶段为了完成某个功能会给程序员提供一个接口,一个员工负责去使用接口,另一个员工去负责实现接口,为了高效工作两个人同时并发进行,那么,在使用接口的时候由于不知道其子类的名称无法直接创建对象去调用接口方法,那么这时就可以利用反射技术,从配置文件中读取具体类名即可调用其方法执行功能;那么另外一端,完成接口子类的实现后可以将其具体类名直接设置到配置文件即可,这样使工作效率更高,而且使程序更具有扩展性,降低了类与类直接的耦合性。
eg:定义一个接口信息,用子类将其方法实现,然后在另外一处使用时用读取配置文件的方式,在运行时调用对象去访问子类实现的接口方法。
interface FunctionInterface
{
void executeFun();
}
class Function implements FunctionInterface
{
public void executeFun()
{
System.out.println("The Function's executeFun is running...");
}
}
然后,在另外一个功能类中去加载配置文件并执行接口功能,提高程序扩展性
import java.lang.reflect.*;
import java.util.*;
import java.io.*;
class Demo
{
public static void main(String[] args) throws Exception
{
//读取硬盘上的配置文件
InputStream in=new FileInputStream("configuration.properties");
//创建properties对象,并加载配置文件输入流信息
Properties prop=new Properties();
prop.load(in);
//获取配置文件中的className的属性信息
String className=prop.getProperty("className");
//获取接口实现类的字节码文件对象
Class cls=Class.forName(className);
//创建接口对象,创建对象时使用无参构造函数可以直接用Class对象
//的newInstance方法,而需要传递参数则要创建Constructor对象
FunctionInterface inter=(FunctionInterface)cls.newInstance();
inter.executeFun();
}
}
interface FunctionInterface
{
void executeFun();
}
3、JavaBean类中用到的反射技术。JavaBean是Java中一种比较特殊的类,该类型的对象提供了一组用于读取和设置属性的公共方法,而且,方法的命名规则一般是set或get动作加上属性名(属性名首字母大写)的形式,所以,可以通过使用公共方法可在模块间对对象的属性信息进行传递。该类型对象一般用于在模块间传递数据信息,通过获取一个对象的属性,即可知道对于的设置和读取操作方法名,然后,利用反射机制调用公共方法达到传递数据的目的。eg:
定义一个JavaBean类,注意必须是公共类,在独立的.java文件中声明。其TextFormatBean.java内容为:
//创建一个定义文本格式的JavaBean类,基本属性有字体名称、颜色、大小信息
public class TextFormatBean
{
private String fontName;//字体名称
private String fontColor;//字体颜色
private int fontSize;//字体大小
TextFormatBean()
{
this.fontName="宋体";
this.fontColor="黑色";
this.fontSize=12;
}
//设置属性信息
public void setFontName(String name)
{
this.fontName=name;
}
public void setFontColor(String color)
{
this.fontColor=color;
}
public void setFontSize(int size)
{
this.fontSize=size;
}
//读取属性信息
public String getFontName()
{
return fontName;
}
public String getFontColor()
{
return fontColor;
}
public int getFontSize()
{
return fontSize;
}
public String toString()
{
return "文本格式:"+fontName+" "+fontColor+" "+fontSize;
}
}
在BeanDemo.java中对JavaBean类对象进行数据读取和设置——原理就是利用了Java反射机制
import java.io.*;
import java.lang.reflect.*;
import java.beans.*;
class BeanDemo
{
public static void main(String[] args) throws Exception
{
TextFormatBean text=new TextFormatBean();
System.out.println(text.toString());
//获取对象属性——字体颜色
Class cls=text.getClass();
//属性名信息,可以通过读取配置文件方式来获取
String propertyName="fontColor";
//创建PropertyDescriptor对象,调用其getReadMethod或getWriteMethod方法,获取读取和设置属性的方法
PropertyDescriptor pd=new PropertyDescriptor(propertyName,cls);
//获取设置方法对象,其原理就是利用反射技术
Method set1=pd.getWriteMethod();
//访问原类的设置属性方法,设置字体颜色信息
set1.invoke(text,"红色");
System.out.println(text.toString());
}
}
运行结果:
4、在动态代理中也用到了反射技术,后面的日记会有所涉及。