Java动态代理的简单实现

Posted 小楼夜听雨QAQ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java动态代理的简单实现相关的知识,希望对你有一定的参考价值。

导读:请注意,只是用代码简单的实现了一下,并未深追源码或者做详细的解释。

正文:

Spring的Aop是基于Java的动态代理来实现的,java中动态代理有两种实现方式:

  • cglib
  • jdk

下面的例子是基于jdk动态代理的简单实现:

 

UserLogin:

public interface UserLogin {
    String login(String username, String password);
}

UserLoginImpl:

public class UserLoginImpl implements UserLogin {
    @Override
    public String login(String username, String password) {
        String msg =  "login="+username+"+"+password;
        System.out.println(msg);
        return msg;
    }
}

LoginProxy:

public class LoginProxy {
    public static Object getInstance(final UserLogin object){
        return Proxy.newProxyInstance(LoginProxy.class.getClassLoader(), object.getClass().getInterfaces(), new InvocationHandler() {
            /**
             *
             * @param proxy 代理对象
             * @param method 方法
             * @param args  方法的参数
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println(method.getName()+"  要执行了");
                Object invoke = method.invoke(object,args);
                System.out.println(method.getName()+"  执行完了");
                return invoke;
            }
        });
    }

    public static void main(String[] args) {
        UserLogin userLogin = new UserLoginImpl();

        UserLogin object = (UserLogin) LoginProxy.getInstance(userLogin);
        object.login("user","456");
    }
}

测试结果:

login  要执行了
login=user+456
login  执行完了

标红出不可以换成:

 UserLogin.class.getInterfaces()

否则会报错如下:

Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to com.ph.UserLogin
    at com.ph.LoginProxy.main(LoginProxy.java:31)

 原因是:getInterfaces方法在java反射中的作用是:获取对象的所有接口。而在测试的过程中(main方法内),给getInstance()方法传的是实现接口的对象,提供了接口的信息,符合要求。UserLogin本身就是接口,用UserLogin.class会报错。(未深究,欢迎批评指正)

以上是关于Java动态代理的简单实现的主要内容,如果未能解决你的问题,请参考以下文章

JDK 动态代理(原理 + 代码实现)

简单实现动态代理(Proxy)

java静态代理与动态代理简单分析

百度T7:深入理解Java动态代理与代码模拟JDK实现动态代理JAVA核心

JAVA之AOP

如何用Java动态代理实现AOP