Java代理(jdk靜態代理、動態代理和cglib動態代理)

jdk靜態代理

public interface AddService {
    Integer add(int a, int b);
}
public class AddServiceImpl implements AddService {
    @Override
    public Integer add(int a, int b) {
        return a + b;
    }
}
public class AddServiceProxy implements AddService{
    private AddService addService;

    public AddServiceProxy(AddService addService) {
        this.addService = addService;
    }

    public static void main(String[] args) {
        AddService addService = new AddServiceImpl();
        AddService addServiceProxy = new AddServiceProxy(addService);
        addServiceProxy.add(1, 3);
    }

    @Override
    public Integer add(int a, int b) {
        System.out.println("before");
        int result =  addService.add(a, b);
        System.out.println("result: " + result);
        System.out.println("after");
        return result;
    }
}

jdk動態代理

jdk動態代理的業務類必須實現接口java

public interface AddService {
    Integer add(int a, int b);
}

業務類的實現類ide

public class AddServiceImpl implements AddService {
    @Override
    public Integer add(int a, int b) {
        return a + b;
    }
}

代理類的生成this

public class AddServiceHandler implements InvocationHandler {
    private AddService addService;
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before");
        Object invoke = method.invoke(addService, args);
        System.out.println(invoke);
        System.out.println("after");
        return invoke;
    }

    public AddServiceHandler(AddService addService) {
        this.addService = addService;
    }

    public AddService getProxy() {
        return (AddService) Proxy.newProxyInstance(addService.getClass().getClassLoader(), addService.getClass().getInterfaces(), this);
    }

    public static void main(String[] args) {
        AddService service = new AddServiceImpl();
        AddServiceHandler addServiceHandler = new AddServiceHandler(service);
        AddService proxy = addServiceHandler.getProxy();
        proxy.add(1, 2);
    }
}

cglib動態代理

業務類不須要實現接口,但不能業務類須要繼承,因此業務類不能是final及業務類的相應方法不能是final代理

public class AddServiceImpl {
    public Integer add(int a, int b) {
        return a + b;
    }
}
public class AddServiceCglib implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("before");
        Object result = methodProxy.invokeSuper(o, objects);
        System.out.println("result:" + result);
        System.out.println("after");
        return result;
    }

    public Object getInstance(Class clzz) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clzz);
        enhancer.setCallback(this);
        return enhancer.create();
    }

    public static void main(String[] args) {
        AddServiceCglib cglib = new AddServiceCglib();
        AddServiceImpl addServiceImpl = (AddServiceImpl) cglib.getInstance(AddServiceImpl.class);
        addServiceImpl.add(1,7);
    }
}
相關文章
相關標籤/搜索