实现java的动态代理需要的三个类:
1,目标类
2,公共接口
3,处理类(执行目标类的方法+对目标方法实现增强)
代码实现
目标类:
//目标类,比如是金士顿工厂,目标类要实现公共接口
public class ObjectClass implements PublicImpl{
@Override
public void USBsell() {
System.out.println("金士顿工厂卖U盘,50元一个");
}
}
公共接口:
//公共接口,代理类和目标类的公共接口
public interface PublicImpl {
void USBsell();
}
处理类:
//定义一个MyHandler处理类,用于实现目标方法,以及对目标方法进行增强
public class MyHandler implements InvocationHandler{
//用构造方法接收传入的目标对象,只有接收了目标对象,下面才可以调用目标对象的方法
Object target=null;
MyHandler(Object target){
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//利用目标对象调用目标对象的方法
method.invoke(target, args);
//对目标对象增强实现
System.out.println("增强实现:对U盘加价,100一个");
return null;
}
}
有了上面三个类,就可以调用Proxy.newProxyInstance(),newProxyInstance方法会返回一个Object类型的对象,将这个对象强制转换成公共接口类型,就可以用这个公共接口类型调用公共接口里面的方法
@Test
public void proxytest(){
ObjectClass objectIns = new ObjectClass();
//newProxyInstance方法会返回一个Object类型的对象,将这个对象强制转换成公共接口类型
PublicImpl PImpl = (PublicImpl)Proxy.newProxyInstance(objectIns.getClass().getClassLoader(),//获得目标类的类加载器
objectIns.getClass().getInterfaces(),//获得目标类实现的接口
new MyHandler(objectIns));//new 一个处理类的对象,并给对象传参,参数是目标类
//利用公共接口类型调用接口里面的方法
//调用这个方法相当于把MyHandler里面的方法都执行一遍
PImpl.USBsell();
}
最后输出: