------- android培训、java培训、期待与您交流! ----------
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。
1、反射提高了程序的扩展性
2、配置文件和接口的方式是编程更加简单。
以TomCat服务器为例:
TomCat对外提供了一个Servlet接口,定义了处理请求和应答的方式。
以及一个web.xml配置文件,用户可以自定义MyServlet类实现Servlet接口
将类名添加到web.xml配置文件中,服务器可以根据类名获取class文件,
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培训、期待与您交流! ----------