JDK动态代理的实现
1.动态代理的例子
- 首先创建一个接口car
public interface Car {
public String sayCar();
void carName(String name);
}
- 在创建一个car的实现类bus
public class Bus implements Car{
@Override
public String sayCar() {
return "I am a bus";
}
@Override
public void carName(String food) {
System.out.println("宇通客车");
}
}
- 然后创建一个汽车工厂,汽车工厂就相当于是一个proxy类,汽车工厂的newProxyInstance()就是生产代理类的工具。Object就是不管什么东西都可以往工厂里塞(proxy),它都可以复制出来。
- newProxyInstance()方法的参数
- 一个类的加载器
- 接口
- 一个object
//下面这个会报错
class ProxyCarFactory {
public static Object getCar(Object object) {
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), );
}
}
- 最后一个参数得不到,就创建一个BusCopy类;
要重写invoke方法,对汽车进行加工
class BusCopy implements InvocationHandler{
private Object object;
public void bind(Object o){
this.object=o;
}
@Override
//可以在invoke中进行汽车改造
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("加两个轮子");
Object invoke = method.invoke(object, args);
System.out.println("加两个大灯");
return invoke;
}
}
这样就可以在proxyCarFactory中创建一个busCopy对象。
class ProxyCarFactory {
public static Object getCar(Object object) {
BusCopy busCopy =new BusCopy();
busCopy.bind(object);
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),busCopy );
}
}
创建一个test类打印
class test{
public static void main(String[] args) {
Bus bus =new Bus();
Car proxyCar = (Car) ProxyCarFactory.getProxyInstance(bus);
//当通过代理类对象调用方法时,会自动的调用被代理类中同名的方法
String sayCar = proxyCar.sayCar("我是众泰汽车");
System.out.println(sayCar);
proxyCar.carName("宝马");
}
}