Tinking in java 琐碎知识点之反射(二)

2014-11-23 22:21:55 · 作者: · 浏览: 1
lect.*; import java.util.*; public class ExtendObjectPoolFactory { //定义一个对象池,前面是对象名,后面是实际对象 private Map objectPool=new HashMap (); //定义一个创建对象的方法,该方法只要传入一个字符串类名,程序就可以根据类名来生成java对象 private Object creatObjet(String clazzName) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ Class clazz=Class.forName(clazzName); return clazz.newInstance(); } private Properties config=new Properties(); //该方法根据指定文件来初始化对象池,它会根据配置文件来创建对象 public void initPool(String fileName){ FileInputStream fis=null; try { fis=new FileInputStream(fileName); config.load(fis); //System.out.println("prop.stringPropertyNames():"+prop.stringPropertyNames()); //对于每取出的属性名、属性值对,如果属性名中不包含%,就根据属性值创建一个对象,并将对象放入对象池中 for(String name:config.stringPropertyNames()){ if(!name.contains("%")){ objectPool.put(name, creatObjet(config.getProperty(name))); } } } catch (Exception e) { System.out.println("读取"+fileName+"异常!"); } finally{ try { if(fis!=null){ fis.close(); } } catch (Exception e2) { e2.printStackTrace(); } } } //每取出一对属性名-属性值对,如果属性名中包含百分号(%),即可认为该属性是用于为对象设置属性值 //程序将调用对应的setter方法来为对应的属性设置属性值 public void initPropertyByMethodReflect() throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{ for(String name:config.stringPropertyNames()){ if(name.contains("%")){ String[] keyAndValue=name.split("%"); Object target=getObject(keyAndValue[0]); //String mtdName="set"+keyAndValue[1].substring(0,1).toUpperCase()+keyAndValue[1].substring(1); String mtdName="setTitle";//与上面的语句功能相同 //通过对象的getClass方法获取他的实现类对应的Class对象 Class clazz=target.getClass(); Method mtd=clazz.getMethod(mtdName,String.class); mtd.invoke(target, config.getProperty(name)); } } } //从object中取出指定name对应的对象 public Object getObject(String name){ return objectPool.get(name); } public static void main(String[] args) throws Exception { ExtendObjectPoolFactory ofy=new ExtendObjectPoolFactory(); ofy.initPool("extObj.txt"); ofy.initPropertyByMethodReflect(); System.out.println(ofy.getObject("a")); } }
27、通过反射访问属性值
import java.lang.reflect.*;
import static java.lang.System.*;
public class FieldTest {
	public static void main(String[] args) throws Exception {
		Person p=new Person();
		Class
  
    personClass=Person.class;
		// 使用getDeclaredField方法获取各种控制符的field
		Field namefield=personClass.getDeclaredField("name");
		//设置通过反射来访问Field时取消访问权限检查
		namefield.setAccessible(true);
		namefield.set(p, "zpc周");
		Field agefield=personClass.getDeclaredField("age");
		agefield.setAccessible(true);
		agefield.set(p, 22);
		out.println(p);
	}


}
class Person{
	private String name;
	private int age;
	public String toString(){
		return "Person[name="+name+",age="+age+"]";
	}
}
//输出:Person[name=zpc周,age=0]
  

28、泛型与反射
import java.util.Date;
import javax.swing.JFrame;
public class ReflectAndGeneric {
	public static 
  
    T getInstance(Class
   
     cls){ try { return cls.newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } public static void main(String[] args) { Date d=ReflectAndGeneric.getInstance(Date.clas