欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JDK动态代理

程序员文章站 2022-08-01 14:14:42
JDK动态代理是通过JDK中的 java.lang.reflect.Proxy 类来实现的。 举例: 1.有如下接口和实现类: 接口: 实现类: 2.创建切面类MyAspect 3.创建MyBeanFactory类,在该类中通过Proxy实现动态代理 这里模拟了Spring框架Ioc思想代理类主要是 ......

jdk动态代理是通过jdk中的 java.lang.reflect.proxy 类来实现的。

举例:

1.有如下接口和实现类

接口:

public interface userdao {

    public void save();
    public void update();
    public void delete();
    public void find();


}

 实现类:

public class userdaoimpl implements userdao {
    public void save() {
        system.out.println("save 添加用户");
    }

    public void update() {
        system.out.println("update 修改用户");
    }

    public void delete() {
        system.out.println("delete 删除用户");
    }

    public void find() {
        system.out.println("find 查询用户");
    }
}

 2.创建切面类myaspect

public class myaspect {

    public void mybefore(){
        system.out.println("方法执行前");
    }

    public void myafter(){
        system.out.println("方法执行后");
    }

}

 3.创建mybeanfactory类,在该类中通过proxy实现动态代理

public class mybeanfactory {

    public static userdao getbean(){
        // 1.准备目标类
        final userdao userdao = new userdaoimpl(); // 在spring中通过注入获取单例对象
        //2.创建切面类
        final myaspect myaspect = new myaspect();
        //3.使用代理类,进行增强
        return (userdao)proxy.newproxyinstance(mybeanfactory.class.getclassloader(),new class[]{userdao.class},new invocationhandler(){
            public object invoke(object proxy, method method, object[] args) throws invocationtargetexception, illegalaccessexception {
                //增强前
                myaspect.mybefore();
                object obj = method.invoke(userdao,args);
                //增强后
                myaspect.myafter();
                return obj;
            }
        });

    }

 这里模拟了spring框架ioc思想
代理类主要是对创建的实例中的方法进行增强

4.测试

@test
    public void demo3(){
        
        userdao userdao = mybeanfactory.getbean();
        userdao.save();
        userdao.delete();
        userdao.find();
        userdao.update();

    }

测试结果:

JDK动态代理

5.总结:jdk动态代理模式可以减少系统间的重复代码,达到模块间的松耦合目的,让方法只关注于业务本身。