heiqiubaihu

Java代理模式

  • 静态代理
  • 动态代理
  • Cglib
    ---
    代理模式:
    为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。


---
静态代理:

public interface UserInterface {
    public void say();
}

public class User implements UserInterface{
    public void say() {
        System.out.println("hello");
    }
}

public class UserStaticProxy implements UserInterface{
    private User user = new User();
    public UserStaticProxy(User user){
        this.user = user;
    }
    @Override
    public void say() {
        System.out.println("静态代理前");
        user.say();
        System.out.println("静态代理后");
    }
}

Output:

动态代理:

public class UserDynamicFactory {
    private Object object;
    public UserDynamicFactory(Object obj){
        this.object = obj;
    }

    public Object getIntance(){
        return Proxy.newProxyInstance(
            object.getClass().getClassLoader(),
            object.getClass().getInterfaces(),
            new InvocationHandler() {
                @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("动态代理前");
                Object o = method.invoke(object);
                System.out.println("动态代理后");
                return o;
            }
        });
    }
}

Output:

Cglib:

public class Staff {
    public void say(){
        System.out.println("Woo!!!!");
    }
}

public class StaffCglib implements MethodInterceptor {
    private Object object;
    public StaffCglib(Object object){
        this.object = object;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("Cglib前");
        Object obj = method.invoke(object);
        System.out.println("Cglib后");
        return obj;
    }
    public Object getInstance(){
        Enhancer en  = new Enhancer();
        en.setSuperclass(object.getClass());
        en.setCallback(this);
        return en.create();
    }
}

OutPut:

测试代码:

public class ProxyTest {
    public static void main(String[] args){
        User user = new User();
        new UserStaticProxy(user).say();
        UserInterface userDynamic = (UserInterface) new UserDynamicFactory(user).getIntance();
        userDynamic.say();
        Staff staffCglib = (Staff)new StaffCglib(new Staff()).getInstance();
        staffCglib.say();
    }
}

注意事项:

测试如果是自己引入jar包,需要引入cglib和asm包(cglib3.1及以上版本和asm2.2以上版本有冲突)

相关文章:

  • 2022-01-07
  • 2021-07-12
猜你喜欢
  • 2021-05-23
  • 2021-08-07
  • 2021-07-13
相关资源
相似解决方案