------- android培训、java培训、期待与您交流! ----------
反射定义:
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。
反射的好处:
1、反射提高了程序的扩展性
2、配置文件和接口的方式是编程更加简单。
以TomCat服务器为例:
TomCat对外提供了一个Servlet接口,定义了处理请求和应答的方式。
以及一个web.xml配置文件,用户可以自定义MyServlet类实现Servlet接口
将类名添加到web.xml配置文件中,服务器可以根据类名获取class文件,
反射相关类:
Class 字节码文件类
首先创建字节码文件对象,有三种方式:
--1、Class clazz = Person.class; //--需要事先知道类名--2、Class clazz = p.getClass(); //--需要该类对象
--3、Class clazz = Class.forName("Person"); //--可以通过传入参数来获取字节码文件
然后通过字节码文件对象创建该类的实例:
Object obj = clazz.newInstance();//构造默认无参对象,如果构造函数private则出现异常获取构造器
Constructor constructor = clazz.getConstructor(String.class,int.class)//获取指定参数的公共构造器
Object obj = constructor.newInstance("小明",25);//通过构造器对象创建对象
//-- getDeclaredConstructors(); 返回 Constructor 对象的一个数组
获取字段
Field field = clazz.getDeclaredField("name");//获取name字段;getField()只能获取公共的
field.setAccessible(true);//暴力访问
field.get(obj);//返回“小明”
field.set(obj,"小强");//设置obj对象的field值
field.getType();//返回 class String
获取方法
Method method = clazz.getMethod("show",null);//获取show空参数方法
method.invoke(obj,null);//调用obj对象的method空参数方法
Method method = clazz.getDeclaredMethod("privateMethod", null);//获取私有方法
method.setAccessible(true);//暴力访问
method.invoke(obj, null);//调用obj的私有方法
举例:
电脑运行需要主板board,主板上有PCI插槽,网卡、声卡等为主板提供各种功能。
主板通过PCI插槽扩展功能,PCI定义为一个接口,声卡和网卡实现接口的功能,通过主板调用接口即可。
PCI接口代码:
public interface PCI {
public void open();
public void close();//定义一个开,一个关的方法共主板调用
}声卡实现PCI接口:
public class SoundCard implements PCI {
public void open(){
System.out.println("sound open");
}
public void close(){
System.out.println("sound close");
}
}主板调用PCI接口:
public class Mainboard {
public void run() {
System.out.println("main board run....");
}
public void usePCI(PCI p) {
if (p != null) {
p.open();
p.close();
}
}
}通过配置文件传递类名,通过反射获取字节码文件,调用方法:
public class ReflectTest {
public static void main(String[] args) throws Exception {
Mainboard mb = new Mainboard();
mb.run();
File configFile = new File("pci.properties");//配置文件
Properties prop = new Properties();
FileInputStream fis = new FileInputStream(configFile);
prop.load(fis); //关联配置文件
for(int x=0; x<prop.size(); x++){
String pciName = prop.getProperty("pci"+(x+1)); //配置文件保存格式为 pci1=SoundCard
Class clazz = Class.forName(pciName);//用Class去加载这个pci子类。
PCI p = (PCI)clazz.newInstance();//多态
mb.usePCI(p);
}
fis.close();
}
}
本文详细介绍了Java反射机制的概念、功能及使用方法。包括如何在运行时获取类的信息、创建对象、调用方法等内容,并通过一个具体的例子展示了如何利用配置文件和反射机制实现组件的动态加载。
262

被折叠的 条评论
为什么被折叠?



