JavaSE基础:反射机制

  ------- 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();				
	}

}


      ------- android培训、java培训、期待与您交流! ----------

你可能感兴趣的:(JavaSE基础:反射机制)