java三种代理

本文深入解析了代理模式在软件设计中的应用,包括静态代理、动态代理(JDK动态代理和CGLIB动态代理)的实现原理及代码示例,为读者提供了全面的理解和实践指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代理的类必须要继承某个接口

一、静态代理

    1:创建用户接口类

package proxy;

/**
 * 创建用户接口类
 */
public interface UserInterface {
    void printUserName(String name);
}

2:创建用户实现类

package proxy;

/**
 * 用户实现类
 */
public class UserService implements UserInterface {
    @Override
    public void printUserName(String name) {
        System.out.println(name);
    }
}

3:创建静态代理类

package proxy;

/**
 * 静态代理类
 */
public class UserStaticProxy implements  UserInterface{
    private UserInterface userInterface;

    public UserStaticProxy(UserInterface userInterface) {
        this.userInterface = userInterface;
    }

    @Override
    public void printUserName(String name) {
        System.out.println("前置");
        userInterface.printUserName("张三");
        System.out.println("后置");
    }
}

4:创建测试类

package proxy;

public class TestStatus {
    public static void main(String[] args) {
        new UserStaticProxy(new UserService()).printUserName("李四");
    }
}

二、动态代理类

   1:创建用户接口类

package proxy;

/**
 * 创建用户接口类
 */
public interface UserInterface {
    void printUserName(String name);
}

2:创建用户实现类 

package proxy;

/**
 * 用户实现类
 */
public class UserService implements UserInterface {
    @Override
    public void printUserName(String name) {
        System.out.println(name);
    }
}

3:创建动态代理类

 

package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 动态代理类
 * 实现InvocationHandler调用处理器的invoke方法
 */
public class UserProxy implements InvocationHandler {
    /**
     * target是传入的实现类
     */
    private Object target;

    public UserProxy(Object target) {
        this.target = target;
    }

    /**
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //里面写业务逻辑
        System.out.println("前置");
        //返回代理对象
        Object invoke = method.invoke(target, args);
        System.out.println("后置");
        return invoke;
    }
}

4:创建测试类

package proxy;

import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) {
        //实现类对象实例化
        UserService userService=new UserService();
        //userService.getClass().getClassLoader():获取被代理对象的类加载器,获取被代理对象的接口方法,第三个参数是代理对象
        UserInterface userInterface = (UserInterface) Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), new UserProxy(userService));
        //执行方法
        userInterface.printUserName("张三");

    }
}

三、cglib(如果当前被代理类没有可继承的父类,那么就可以使用cglib进行代理)

1:创建被代理对象

package proxy;

/**
 * 被代理对象
 */
public class UserCgLibService {
    public void pringUserName(String username) {
        System.out.println(username);
    }
}

 2:创建cglibProxy代理类,中间出了个小问题,methodProxy.invoke(o, objects)的话会导致死循环,所以需要传methodProxy.invoke(target, objects)

package proxy;


import org.springframework.cglib.proxy.*;

import java.lang.reflect.Method;

/**
 * 创建cglib动态代理类
 * 实现methodInterceptor拦截器
 */
public class CgLibProxy implements MethodInterceptor {
    private Object target;

    public CgLibProxy(Object target) {
        this.target = target;
    }

    public Object getProxyInstance() {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }


    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("前置");
        Object invoke = methodProxy.invoke(target, objects);
        return invoke;
    }
}

3:创建测试类

package proxy;

public class CgLibTest {
    public static void main(String[] args) {
        UserCgLibService service=new UserCgLibService();
        UserCgLibService instance = (UserCgLibService)new CgLibProxy(service).getProxyInstance();
        instance.pringUserName("张三");

    }
}

 

转载于:https://my.oschina.net/undwin/blog/3017751

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值