动态代理
什么是动态代理
在程序运行的过程中,动态创建出代理对象 , 我们可以对代理对象进行增强 , 对其方法进行增强。动态:在程序运行时 ,模式:你 ==>> 运营商(增强) ==>> 厂家,简单的说不需要在类的源码上改动,就能给类增强,让他够更强的功能
具体使用
/**
* 创建一个接口
*/
public interface Car {
public void run();//跑
public void stop();//停
public void jump();//跳
}
/**
* 在创建一个实现类
*/
public class MyCar implements Car{
@Override
public void run() {
System.out.println("跑");
}
@Override
public void stop() {
System.out.println("停");
}
@Override
public void jump() {
System.out.println("跳");
}
}
/**
* 测试动态代理的方法
*/
public class TestDemo {
public static void main(String[] args) {
/**
* java.lang.reflect.Proxy 反射包==>> 运行时
* Car proxyCar = Proxy.newProxyInstance(); 创建一个代理实例
*
* public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
* 参数1: 类加载器 : 将类加载到内存形成class对象
* 动态创建一个类 相当于创建一个java文件 这个类不在内存 我们需要它加载到内存来
* 固定格式: 当前类.class.getClassLoader();
* 参数2: 动态创建的类 不知道方法 接口中有需要的方法名称
* 固定格式: 子类的实例对象.getClass().getInterfaces()
* 通过子类的字节码对象 获得所有的接口 相当于知道了子类实现过的所有方法
*
* 参数3:InvocationHandler 执行处理类
* 动态创建的类只知道接口 方法名称 但是没有实现 执行处理类就是实现
*InvocationHandler(){ public invoke (参数,参数,参数)}
* 有一个invoke方法 invoke方法就是编写增强代码的位置
* invoke方法执行时机, 代理类每调用一次方法(任意) 执行处理类中的invoke将被执行一次
* invoke的三个参数
* public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {}
* 代理类每调用一次方法(任意) 执行处理类中的invoke将被执行一次 同时 将传入三个参数
* 参数1: 代理的对象(我们不用 底层会使用)
* 参数2: 当前被执行的方法对象
* 参数3: 当前被执行方法对象中的参数 如果有 以数组拼接 如果没有 就是null
*/
//原来的汽车
Car car = new MyCar();
//新汽车
Car proxyCar = (Car)Proxy.newProxyInstance(
TestDemo.class.getClassLoader(),
car.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强代码
if("jump".equals(method.getName())){
System.out.println("开始增强--飞");
method.invoke(car,args); //对方法进行增强后,放行原来的方法
return null;//在此处 return 表示后续的代码将不再运行 直接返回
}
//放行原来放法
method.invoke( car , args);//参数1:实例对象 参数2: 真实的参数
return null;
}
}
);
proxyCar.run();
proxyCar.jump();
proxyCar.stop();
}
}