java利用反照得到实例
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(); }