美文网首页程序员
JDK动态代理demo

JDK动态代理demo

作者: ALAI丶 | 来源:发表于2016-04-06 17:46 被阅读391次

    1.JDK动态代理

    主要使用到 InvocationHandler 接口和 Proxy.newProxyInstance() 方法。 JDK动态代理要求被代理实现一个接口,只有接口中的方法才能够被代理 。其方法是将被代理对象注入到一个中间对象,而中间对象实现InvocationHandler接口,在实现该接口时,可以在 被代理对象调用它的方法时,在调用的前后插入一些代码。而 Proxy.newProxyInstance() 能够利用中间对象来生产代理对象。插入的代码就是切面代码。所以使用JDK动态代理可以实现AOP。

    下面来看例子

    interface

    public interface UserService {

        void addUser();

        String findUserById();

    }

    impl

    import com.spring.aop.jdk.service.UserService;

    public class UserServiceImpl implements UserService {

        @Override

        public void addUser() {

            System.out.println("start insert user into database");

        }

        @Override

        public String findUserById() {

            System.out.println("start find user by userId");

            return null;

        }

    }

    代理中间类

    import java.lang.reflect.InvocationHandler;

    import java.lang.reflect.Method;

    public class ProxyUtil implements InvocationHandler {

        private Object target;//被代理的对象

        @Override

        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

            System.out.println("do something before");

            // 调用被代理对象的方法并得到返回值

            Object result = method.invoke(target, args);

            System.out.println("do something after");

            return result;

        }

        public ProxyUtil(Object target) {

            this.target = target;

        }

        public Object getTarget() {

            return target;

        }

        public void setTarget(Object target) {

            this.target = target;

        }

    }

    Test

    import java.lang.reflect.Proxy;

    import com.spring.aop.jdk.proxy.ProxyUtil;

    import com.spring.aop.jdk.service.UserService;

    import com.spring.aop.jdk.service.impl.UserServiceImpl;

    public class Main {

        public static void main(String[] args) {

            Object proxyObject = new UserServiceImpl();

            ProxyUtil proxyUtil = new ProxyUtil(proxyObject);

            UserService userService  = (UserService) Proxy.newProxyInstance(

            Thread.currentThread().getContextClassLoader(),

            UserServiceImpl.class.getInterfaces(), proxyUtil);

            userService.addUser();

            userService.findUserById();

        }

    }

    输出结果

    do something before

    start insert user into database

    do something after

    do something before

    start find user by userId

    do something after

    相关文章

      网友评论

        本文标题:JDK动态代理demo

        本文链接:https://www.haomeiwen.com/subject/ealplttx.html