JDK动态代理学习

1.什么是JDK动态代理

JDK动态代理就是在程序运行的过程中再创建一个代理类实现被代理类的接口方法的增强(只能代理实现了接口方法的对象),区别于静态代理事先创建一个代理对象。底层使用了Java的反射技术。

2.为什么要使用JDK动态代理

增加系统的可读性、可拓展性、可维护性(少写代码,偷懒),大名鼎鼎的spring框架就使用了JDK动态代理,最典型的如spring的AOP特性,可以实现事务的管理、消息通知、日志记录、安全监控等,使得开发人员只用关注业务细节,而不需要考虑这些基本通用的功能。

3.怎样学会JDK动态代理

1.学会Java,学会反射
2.学习设计模式
(大话设计模式)
(设计模式之美—王争前Google工程师)
3.先思考,然后自己动手写一写
实现JDK动态代理关键的对象
InvocationHandler接口
很明显该接口是在Java的反射包里,所以他使用到了反射,该接口只有一个方法invoke,需要增强的逻辑就写在这里

package java.lang.reflect;
public interface InvocationHandler {
    
    
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;
}

Proxy对象

Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h)方法通过反射生成一个代理对象,该方法里面执行一系列的安全访问策略。

loader:对象的类加载器
interfaces: 对象的接口
InvocationHandler 实现接口的增强处理

动手实现
1.新建一个接口

public interface IUser {
    
    
    void cry();
    void slime();
    void sing();
}

2.新建一个接口实现类

public class User implements IUser {
    
    

    @Override
    public void cry() {
    
    
        System.out.println("cry");
    }

    @Override
    public void slime() {
    
    
        System.out.println("slime");
    }

    @Override
    public void sing() {
    
    
        System.out.println("sing");
    }
}

3.新建一个处理器实现InvocationHandler接口

public class DynmenicHandle implements InvocationHandler {
    
    
    private Object proxyObject;
    public DynmenicHandle(Object proxyObject){
    
    
        this.proxyObject=proxyObject;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Exception{
    
    
        Object result = method.invoke(proxyObject, args);
        System.out.println("此次JDK动态代理方法:"+method.getName());
        return null;
    }
}

4.新建一个代理类

public class DynmenicProxy {
    
    

    
    public Object createProxy(Object proxiedObject){
    
    
        Class[] interfaces = proxiedObject.getClass().getInterfaces();
        DynmenicHandle handler = new DynmenicHandle(proxiedObject);
        return Proxy.newProxyInstance(proxiedObject.getClass().getClassLoader(), interfaces, handler); }
    }

5.main方法

public class Main {
    
    

    public static void main(String[] args) {
    
    
        DynmenicProxy dynmenicProxy=new DynmenicProxy();
        IUser user=(IUser)dynmenicProxy.createProxy(new BUser());
        user.cry();
        user.sing();
        user.slime();
    }
}

6.结果

cry
此次JDK动态代理方法:cry
sing
此次JDK动态代理方法:sing
slime
此次JDK动态代理方法:slime

4.总结

刚开始学习JDK动态代理时,我也是一知半解,随着代码量的增多,一个又一个项目的开发,再回来学习JDK动态代理时,才恍然大悟,王争的设计模式之美给了我很大启发,推荐大家都去看看。

猜你喜欢

转载自blog.csdn.net/m0_38110240/article/details/110486735