jdk动态代理,cglib动态代理例子

jdk:

public interface Person {
    void sing();
    void sleep();
    void dance();
}
public class PersonOne implements Person {
    @Override
    public void sing() {
        System.out.println("personone is singing");
    }

    @Override
    public void sleep() {
        System.out.println("personone is sleeping");
    }

    @Override
    public void dance() {
        System.out.println("personone is dancing");
    }
}
public class JdkProxy implements InvocationHandler {
    private Object obj;

    public JdkProxy(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("调用前");
        Object result = method.invoke(obj, args);
        System.out.println("调用后");
        return result;
    }
    public Object getProxy(){
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        return Proxy.newProxyInstance(classLoader, obj.getClass().getInterfaces(), this);
    }
}
@RunWith(JUnit4.class)
public class Test {
   @org.junit.Test
    public void test(){
       Person person = (Person) new JdkProxy(new PersonOne()).getProxy();
       person.sleep();
       person.dance();
       person.sing();
   }
}

cglib: 需要cglib.jar, asm.jar

public class PersonOne {
    public void sing() {
        System.out.println("personone is singing");
    }

    public void sleep() {
        System.out.println("personone is sleeping");
    }

    public void dance() {
        System.out.println("personone is dancing");
    }
}
public class CglibProxy {
    private Object obj;

    public CglibProxy(Object obj) {
        this.obj = obj;
    }
    public Object getProxy(){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(obj.getClass());
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                System.out.println("调用前");
                method.invoke(obj, args);
                System.out.println("调用后");
                return proxy;
            }
        });
        return enhancer.create();
    }
}
@RunWith(JUnit4.class)
public class Test {
    @org.junit.Test
    public void test(){
        PersonOne personOne = (PersonOne) new CglibProxy(new PersonOne()).getProxy();
        personOne.dance();
        personOne.sing();
        personOne.sleep();
    }
}

猜你喜欢

转载自blog.csdn.net/u011943534/article/details/79470952