Java SDK动态代理

动态代理分为Java SDK 动态代理以及cglib动态代理,这里先了解下Java SDK动态代理

Java SDK动态代理代码demo:

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

public class JDKDynamicProxyDemo {
    static interface Iservice {
        void sayHello();
    }

    static class Service implements Iservice {
        @Override
        public void sayHello() {
            System.out.println("say hello~~~~~");
        }
    }

    static class JDKInvocationHandler implements InvocationHandler {
        //被代理对象
        private Object object;

        public JDKInvocationHandler(Object object) {
            this.object = object;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("before--say hello");
            Object invoke = method.invoke(object, args);
            System.out.println("after--say hello");
            return invoke;
        }

        /**
         * 生成代理类对象
         *
         * @return
         */
        public Object newProxyInstance() {
            return Proxy.newProxyInstance(
                    object.getClass().getClassLoader(),
                    object.getClass().getInterfaces(),
                    this);
        }
    }

    public static void main(String[] args) {
        JDKInvocationHandler jdkInvocationHandler = new JDKInvocationHandler(new Service());
        Iservice service = (Iservice) jdkInvocationHandler.newProxyInstance();
        service.sayHello();
    }
}

运行结果如下:
在这里插入图片描述
可以发现Java SDK动态代理其实是使用了Proxy与InvocationHandler配合,由Proxy在运行期生成代理对象,之后代理对象调用相应的方法,最后实际上真正调用的却是实现了InvocationHandler接口的类的invoke()方法中的逻辑。

总结

动态代理采用了运行期生成代理对象的方式,相比起静态代理,使用动态代理可以省去大量的静态代理类。

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/107633217