動態代理功能封裝

weixin_34148340發表於2018-05-30

原文地址:https://www.jianshu.com/p/f3a7ce6b73c5
qq群:614530228

為了方便使用,不再重複使用相同的程式碼,所以對動態代理進行了封裝。不足之處,歡迎指正。

動態代理類封裝

  • 第一種方式
/**
 * 動態代理的工具類
 */
public class ProxyUtil {

    /**
     * 獲取動態代理的物件
     *
     * @param clz 實現介面的class物件
     * @param e   實現介面的物件
     * @param <T> 介面物件
     * @param <E> 實現介面的物件
     * @return
     */
    public static <T, E> T newInstance(Class clz, E e) {
        return (T) Proxy.newProxyInstance(clz.getClassLoader(), clz.getInterfaces(), new MyProxy<>(e));
    }


    /**
     * 實現動態代理的物件
     *
     * @param <E> 實現介面的物件
     */
    static class MyProxy<E> implements InvocationHandler {

        E e;

        public MyProxy(E e) {
            this.e = e;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            return method.invoke(e, args);
        }
    }

}
public interface UserService {
    String getUsername();
}

public class UserServiceImpl implements UserService {
    @Override
    public String getUsername() {
        return "Venus";
    }
}

呼叫方式

public class Test {
    public static void main(String[] args) {
        UserService us = ProxyUtil.newInstance(UserServiceImpl.class, new UserServiceImpl());
        System.out.println(us.getUsername());
    }
}
  • 第二種方式
/**
 * 動態代理的工具類
 */
public class ProxyUtil {

    /**
     * 獲取動態代理的物件
     *
     * @param clz 介面的class物件
     * @param e   實現介面的物件
     * @param <T> 介面物件
     * @param <E> 實現介面的物件
     * @return
     */
    public static <T, E> T newInstance(Class<T> clz, E e) {
        return (T) Proxy.newProxyInstance(clz.getClassLoader(), new Class<?>[]{clz}, new MyProxy(e));
    }

    /**
     * 實現動態代理的物件
     *
     * @param <E> 實現介面的物件
     */
    static class MyProxy<E> implements InvocationHandler {

        E e;

        public MyProxy(E e) {
            this.e = e;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            return method.invoke(e, args);
        }
    }
}

呼叫方式

public class Test {
    public static void main(String[] args) {
        UserService us = ProxyUtil.newInstance(UserService.class, new UserServiceImpl());
        System.out.println(us.getUsername());
    }
}

您的喜歡,是我堅持不懈的動力。

The end---

相關文章