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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值