标签:
一、概述
1、java反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法.简而言之,动态获取类中信息就是反射.
2、java反射应用在很多java软件和框架中,例Tomcat,提供了处理请求和应答的方式,因为具体的处理动作不同,所以对外提供了接口,由开发者来实现具体的请求和应答处理.这个接口就是servlet,开发者只要实现servlet接口,并配置相应的配置文件,对Tomcat来说就是在web.xml中配置servletname也就是类名,这样tomcat就能通过所谓的反射来加载该类的class文件,并获取类中的所有信息,从而实现开发者自定义的请求和应答处理方式.开发玩接口+配置文件.
二、Class对象
1、类用来描述对象共性的信息,用来描述字节码文件的共性的类是Class类,该类提供获取字节码文件中的内容,包括类名称,属性和函数.反射依靠该类来完成.
2、获取字节码文件对象的三种方式:
1.Object类的getClass()方法,必须明确具体的类,麻烦.
2.任何数据类型都具备一个class静态属性来获取对于的Class对象.
3.通过给定的类的字符串名称就可以获取该类Class对象,更易扩展,该方法是forName(). 一般使用这种
例:String name="cn.itcast.Person"; Class c = Class.forName(name);
三、获取Class中的构造函数
import java.lang.reflect.Constructor; class Person{ String name; int age; public Person(){ System.out.println("wu can"); } public Person(String name,int age){ System.out.println("you can"); } } public class TestPerson { public static void main(String[] args) throws Exception{ //根据被new类的名称查找该类的字节码文件,加载进内存,创建该字节码文件对象,创建对应的Person对象. Person p = new Person(); //根据字符串的名称查找该类的字节码文件,加载进内存,创建该字节码文件对象,创建对应的Person对象. String name="com.czbk.faceObjcet.Person"; Class clazz = Class.forName(name); //只能调用无参构造函数 Person p1 =(Person)clazz.newInstance(); //调用有参构造函数,getDeclaredConstructor可获取私有构造函数 Constructor c = clazz.getConstructor(String.class,int.class); Object o=c.newInstance("ww",26); } }
四、获取Class中的字段
public class TestPerson { public static void main(String[] args) throws Exception{ String str="com.czbk.faceObjcet.Person"; Class clazz = Class.forName(str); Object o = clazz.newInstance(); Field f = clazz.getField("name"); //只能获取公有属性,可获取父类 Object obj = f.get(o); Field f1 = clazz.getDeclaredField("age");//可获取私有属性,只限本类 f1.setAccessible(true); //对私有字段的访问取消权限检查,暴力访问 System.out.println(f1.get(o)); f1.setInt(o,22); System.out.println(o); } }
五、获取Class中的方法
public class TestPerson { public static void main(String[] args) throws Exception{ String str="com.czbk.faceObjcet.Person"; Class clazz = Class.forName(str); Object o = clazz.newInstance(); //调用无参方法 Method method=clazz.getMethod("toString", null); method.invoke(o, null); //调用有参方法 Method method1=clazz.getMethod("toString1", String.class); method1.invoke(o, "sss"); } }
六、主板运行实例(接口+配置)
public interface PCI { void run(); void close(); }
public class SoundCard implements PCI{ public void run() { System.out.println("SoundCard Run"); } public void close() { System.out.println("SoundCard Close"); } }
public class NetCard implements PCI{ public void run() { System.out.println("NetCard run"); } public void close(){ System.out.println("NettCard clase"); } }
public class MainBoard { /*public void run(PCI p){ p.run(); } public void clase(PCI p){ p.close(); }*/ public static void main(String[] args) throws Exception { //这种方式每次增加新硬件时都需要修改主板源代码 /*SoundCard sc = new SoundCard(); MainBoard mb = new MainBoard(); mb.run(sc); mb.clase(sc);*/ //增加硬件无需修改MainBoard源代码,只要在配置文件中添加 Properties pt = new Properties(); FileInputStream is = new FileInputStream(new File("PCI.properties")); pt.load(is); for(int x=0;x<pt.size();x++){ String PCIName=pt.getProperty("pci"+x); Class clazz = Class.forName(PCIName); PCI p=(PCI)clazz.newInstance(); Method method = clazz.getMethod("run", null); method.invoke(p, null); } } }
标签:
原文地址:http://www.cnblogs.com/wangweiNB/p/4833094.html