java利用反射得到实例
对于面向接口编程的项目免不了要一反射相接触,动态得到实例: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();具体代码: package com.onoff.chijiunan;public interface Adonoffshowbanner {public void on(boolean blon);public void off(boolean bloff);} try { Class<?> c = Class.forName(Adonoff.classname);//Adonoff.classname 包名+类名 Adonoffshowbanner ads = (Adonoffshowbanner)c.newInstance(); ads.off(false); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); }