什么是静态代理
优点
缺点
代码实现如下
/**
* 定义一个接口
*/
interface PayService{
void pay();
}
/**
* 真实业务类
*/
class PayServiceImpl implements PayService{
@Override
public void pay() {
System.out.println("真实业务。。。。。。");
}
}
/**
* 代理类
*/
class StaticProxyPayServiceImpl implements PayService{
private PayService payService;
public StaticProxyPayServiceImpl(PayService payService) {
this.payService = payService;
}
@Override
public void pay() {
System.out.println("代理类----begin");
payService.pay();
System.out.println("代理类----end");
}
}
public class Test {
public static void main(String[] args) {
new StaticProxyPayServiceImpl(new PayServiceImpl()).pay();
}
}
什么是动态代理
实操
定义一个java.lang.reflect.InvocationHandler接口的实现类,重写invoke方法
// Object proxy:被代理的对象
// Method method:要调用的方法
// Object[] args:方法调用时所需要参数
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 定义一个接口
*/
interface PayService{
void pay();
}
/**
* 真实业务类
*/
class PayServiceImpl implements PayService{
@Override
public void pay() {
System.out.println("真实业务。。。。。。");
}
}
/**
* JDK动态代理类
*/
class JdkProxy implements InvocationHandler{
// 目标类
private Object target;
// 获取代理对象
public Object newProxyInstance(Object target){
this.target = target;
// 绑定关系:也就是和具体的哪个实现类关联
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("JDK动态代理:"+method.getName()+"--begin");
Object result = method.invoke(target, args);
System.out.println("JDK动态代理:"+method.getName()+"--end");
return result;
}
}
public class Test {
public static void main(String[] args) {
PayService payServiceImpl = (PayService) new JdkProxy().newProxyInstance(new PayServiceImpl());
payServiceImpl.pay();
}
}
什么是动态代理
代码实现如下
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* 定义一个接口
*/
interface PayService{
void pay();
}
/**
* 真实业务类
*/
class PayServiceImpl implements PayService{
@Override
public void pay() {
System.out.println("真实业务。。。。。。");
}
}
/**
* Cglib动态代理
*/
class CglibProxy implements MethodInterceptor{
// 目标类
private Object target;
// 绑定关系
public Object newProxyInstance(Object target){
this.target = target;
Enhancer enhancer = new Enhancer();
// 设置代理类的父类(目标类)
enhancer.setSuperclass(target.getClass());
// 设置回调函数
enhancer.setCallback(this);
// 创建子类(代理对象)
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("CgLib动态代理:"+method.getName()+"--begin");
Object result = methodProxy.invokeSuper(o, args);
System.out.println("CgLib动态代理:"+method.getName()+"--end");
return result;
}
}
public class Test {
public static void main(String[] args) {
PayService payService = (PayService) new CglibProxy().newProxyInstance(new PayServiceImpl());
payService.pay();
}
}
原文:https://www.cnblogs.com/Gen2021/p/14619122.html