基本解释:
静态代理:
* 特点:
* 代码写死了 private UsbFactory usbFactory = new UsbFactory();
* float v = usbFactory.sellUsb(name);
* 若接口增加新的方法,后续的其他定义都需要进行相应的额修改,不然会报红
*
* 动态代理:
* 基于 jdk 三个重要的类 invoctionhandler proxy method jd部分由invoctionhandler实现来实现对应的方法的使用
* 基于 cglib
* 特点: jdk必须要有实现的接口,cglib,可以没有但是方法不能够是final修饰的
* 他们之间的关系就是互补, cglib 是对于 jdk 的补充
静态代理:
接口usb的定义:
package dynamicproxy;
/**
* @author liuYC
* @ClassName SayHello
* @Description TODO
* @date 2021/6/15 21:35
*/
public interface Usb {
float sellUsb(String name);
}
商家:
package dynamicproxy;
import com.sun.org.apache.bcel.internal.generic.NEW;
import org.apache.ibatis.jdbc.Null;
/**
* @author liuYC
* @ClassName JD
* @Description TODO
* @date 2021/6/15 21:39
* <p>
* 商家进行售卖;调用厂家的方法:
*/
public class JD implements Usb {
private UsbFactory usbFactory = new UsbFactory();
public JD(UsbFactory usbFactory) {
this.usbFactory = usbFactory;
}
@Override
public float sellUsb(String name) {
float v = usbFactory.sellUsb(name);
System.out.println(name);
System.out.println("jd:" + v + 20);
return v + 20;
}
}
厂家:
package dynamicproxy;
/**
* @author liuYC
* @ClassName UsbFactory
* @Description TODO
* @date 2021/6/15 21:38
*
* 厂家卖
*/
public class UsbFactory implements Usb {
@Override
public float sellUsb(String name) {
System.out.println("UsbFactory:" + 20);
return 20.0f;
}
}
顾客购买:
package dynamicproxy;
/**
* @author liuYC
* @ClassName Client
* @Description TODO
* @date 2021/6/15 21:50
*
* 静态代理:
* 特点:
* 代码写死了 private UsbFactory usbFactory = new UsbFactory();
* float v = usbFactory.sellUsb(name);
* 若接口增加新的方法,后续的其他定义都需要进行相应的额修改,不然会报红
*
* 动态代理:
* 基于 jdk 三个重要的类 invoctionhandler proxy method jd部分由invoctionhandler实现来实现对应的方法的使用
* 基于 cglib
* 特点: jdk必须要有实现的接口,cglib,可以没有但是方法不能够是final修饰的
* 他们之间的关系就是互补, cglib 是对于 jdk 的补充
*/
public class Client {
public static void main(String[] args) {
final UsbFactory usbFactory = new UsbFactory();
final JD jd = new JD(usbFactory);
jd.sellUsb("liyuchao");
}
}
基于jdk的动态代理
在静态代理的基础上:商家和对应的client顾客类做些变化:
package dynamicproxy;
import java.lang.annotation.Target;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @author liuYC
* @ClassName myinvoctionhandler
* @Description TODO
* @date 2021/6/15 22:03
*/
public class myinvoctionhandler implements InvocationHandler {
// 需要传入的对象!
Object target = null;
Object res = null;
public myinvoctionhandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
res = method.invoke(target, args);
if (res != null) {
float price = (float) res;
price = price + 20;
System.out.println("price" + price);
}
return null;
}
}
顾客类:
package dynamicproxy;
import java.lang.reflect.Proxy;
/**
* @author liuYC
* @ClassName JdkClient
* @Description TODO
* @date 2021/6/15 22:08
*
* 基于jdk的动态代理的代码
*
*/
public class JdkClient {
public static void main(String[] args) {
UsbFactory usbFactory = new UsbFactory();
myinvoctionhandler myinvoctionhandler = new myinvoctionhandler(usbFactory);
Usb proxy = (Usb)Proxy.newProxyInstance(usbFactory.getClass().getClassLoader(), usbFactory.getClass().getInterfaces(), myinvoctionhandler);
proxy.sellUsb("liyucoa");
}
}
基于cglib的动态代理:接口的声明也不需要了,但是不要声明为final
这个类得声明:大家可以看作是 静态代理中的 interface
package dynamicproxy.cglib;
/**
* @author liuYC
* @ClassName Sell
* @Description TODO
* @date 2021/6/15 22:19
*/
public class Sell {
void sell() {
System.out.println("sell ising sell:" +
"");
}
}
MethodInterceptor类似于jdk的invocationhandler:
package dynamicproxy.cglib;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @ClassName dafd
* @Description TODO
* @author liuYC
* @date 2021/6/15 22:31
*
*/
public class myintercepter implements MethodInterceptor {
// 需要传入的对象!
Object target = null;
Object res = null;
public myintercepter(Object target) {
this.target = target;
}
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
res = method.invoke(target, args);
if (res != null) {
float price = (float) res;
price = price + 20;
System.out.println("price" + price);
}
return null;
}
}
顾客类:
package dynamicproxy.cglib;
import dynamicproxy.Usb;
import dynamicproxy.UsbFactory;
import dynamicproxy.myinvoctionhandler;
import org.springframework.cglib.proxy.Enhancer;
import java.lang.reflect.Proxy;
/**
* @author liuYC
* @ClassName JdkClient
* @Description TODO
* @date 2021/6/15 22:08
* <p>
* 基于cglib 的动态代理的代码
* 不需要对应的有实现 interface的情况出现!
*/
public class CglibClient {
public static void main(String[] args) {
final Sell sell = new Sell();
final myintercepter myintercepter = new myintercepter(sell);
final Sell cglib = (Sell) Enhancer.create(Sell.class, myintercepter);
cglib.sell();
}
}
参考的视频是:
动力节点的动态规划,B站一搜应该就可以的哈: