對于面向接口編程的項目免不了要一反射相接觸,動態(tài)得到實例:
public interface a {
?public void sayHello();
}
---------------------------
第一種情況是當
aImpl實現(xiàn)類為默認的構(gòu)造方法:
根據(jù)類名aImpl動態(tài)得到實例
Class c=Class.forName("aImpl");
a instance=(a)c.newInstance();
a.sayHello();
------------
第二種情況當
aImpl為帶參數(shù)的構(gòu)造方法時:
Class o=Class.forName("aImpl");//aImpl為要實例化的例名,可以從配置文件當中獲取
???Constructor cous = null;
???cous=o.getConstructor(new Class[]{String.class});//構(gòu)造器的參數(shù)類型
???a ao=(a) cous.newInstance(new Object[]{"xxx"});//"xxx為傳入的參數(shù)值
???ao.sayHello();
第三種就是構(gòu)造器為私有的時候,我們通過方法獲取實例getInstance()(自己定的)
Class o=Class.forName("aImpl");
???Method method=o.getMethod("getInstance",new Class[]{String.class});
//getInstance為返回為aImpl實例的方法名
??? a ao=(a) method.invoke(null,new Object[]{"xxx"});//注意了前面的參數(shù)為null,是有
//條件的,就是要求getInstance為static類型的,我想大家都會這樣設計的
?????? ao.sayHello();
做連接池的話,一種方式就是使用動態(tài)代理類,當Connection調(diào)用close()方法時,我們可以利用方法攔截器,在調(diào)用close方法的時候把連接放到緩存里面去,供以后再次利用..
a ao=(a)Proxy.newProxyInstance(aImpl.class.getClassLoader(),aImpl.class.getInterfaces(),
?????new InvocationHandler()
?????{
??????public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
???????Object re=null;
???????System.out.println("before--------"+method.getName());
//在這里我們添加自己的一些處理方法,如把連接放到緩存去撒!
???????//re=method.invoke(new aImpl(),args);
???????return re;
??????}
????
?????});
???ao.sayHello();