JDK动态代理实现

本文详细介绍了Java动态代理的概念及其实现方式,包括静态代理与动态代理的区别,重点讲解了JDK动态代理的工作原理和实现步骤,并附带示例代码。

一、代理

1、代理模式:为其他对象提供一种代理以控制对这个对象的访问,可在执行业务处理的前后进行相关的预处理和后置处理,还可以用于实现延迟加载功能等

2、分类:

1)静态代理:在编译阶段为被需要代理的类,创建一个代理类。当需要被代理的类很多时,需要创建多个代理类。

2)动态代理:运行阶段进行代理,通用性强,常见:JDK动态代理和CGLIB动态代理

二、JDK动态代理实现

public interface ISubject {
    String sayHellow(String name);
}
class SubjectImpl implements ISubject {
    @Override
    public String sayHellow(String name) {
        System.out.println(name + "你好!");
        return name;
    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class TestInvocationHandler implements InvocationHandler {

    private Object target;

    public TestInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("此处是前置处理");
        Object result = method.invoke(target, args);
        System.out.println("此处是后置处理");
        return result;
    }

    public Object getProxy() {
        return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), this);
    }

}
public class Test {
    public static void main(String [] args) {
        ISubject subject = new SubjectImpl();
        TestInvocationHandler invocationHandler = new TestInvocationHandler(subject);
        ISubject proxy = (ISubject) invocationHandler.getProxy();
        proxy.sayHellow("猴子哥哥");
    }
}
三、实现原理

        动态创建代理类,并通过指定类加载器加载,然后在创建代理对象时将InvokerHandler对象作为构造参数传入。当调用代理对象时,会调用InvokerHandler.invoke()方法,并最终调用真正业务对象的相应方法。


具体实现细节,请参照jdk源码,若需了解JDK动态代理与CGLIB动态代理的区别,请参考:http://blog.youkuaiyun.com/qq_21033663/article/details/52295580





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值