對于面向接口編程的項目免不了要一反射相接觸,動態得到實例:
public interface a {
?public void sayHello();
}
---------------------------
第一種情況是當
aImpl實現類為默認的構造方法:
根據類名aImpl動態得到實例
Class c=Class.forName("aImpl");
a instance=(a)c.newInstance();
a.sayHello();
------------
第二種情況當
aImpl為帶參數的構造方法時:
Class o=Class.forName("aImpl");//aImpl為要實例化的例名,可以從配置文件當中獲取
???Constructor cous = null;
???cous=o.getConstructor(new Class[]{String.class});//構造器的參數類型
???a ao=(a) cous.newInstance(new Object[]{"xxx"});//"xxx為傳入的參數值
???ao.sayHello();
第三種就是構造器為私有的時候,我們通過方法獲取實例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"});//注意了前面的參數為null,是有
//條件的,就是要求getInstance為static類型的,我想大家都會這樣設計的
?????? ao.sayHello();
做連接池的話,一種方式就是使用動態代理類,當Connection調用close()方法時,我們可以利用方法攔截器,在調用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();