JDK动态代理介绍

1.创建需要被代理的对象的接口,并实现这个接口

package com.dl.code.dao;

/**
 * Created with IntelliJ IDEA.
 * 作者: 代蒙恩
 * 日期: 2021/2/24
 * 时间: 14:56
 * 描述: JDK动态代理的练习
 * 内容: 当前接口,是需要被代理对象的接口
 */
public interface UserDao {

    public void add();

    public String getUser(String name);
}

实现接口

package com.dl.code.dao.impl;

import com.dl.code.dao.UserDao;

/**
 * Created with IntelliJ IDEA.
 * 作者: 代蒙恩
 * 日期: 2021/2/24
 * 时间: 14:57
 * 描述: JDK动态代理练习
 * 内容: 接口的实现
 */
public class UserDaoImpl implements UserDao {

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

    @Override
    public String getUser(String name) {
        System.out.println("getUser....");
        return name;
    }
}

2.创建JDK代理类

package com.dl.code.JDKProxy;

import com.dl.code.dao.UserDao;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created with IntelliJ IDEA.
 * 作者: 代蒙恩
 * 日期: 2021/2/24
 * 时间: 14:58
 * 描述: JDK动态代理
 * 内容: 动态代理类
 * 创建方式 : 实现 InvocationHandler 接口
 */
public class JDKProxy implements InvocationHandler {

    //定义需要被代理的对象
    private UserDao userDao;

    //提供一个构造器,用来创建JDKProxy对象
    public JDKProxy(UserDao userDao) {
        this.userDao = userDao;
    }

    //提供一个方法,用来创建代理对象
    public UserDao creatProxy(){
        /*
         * 创建代理对象的原理:Java反射技术
         * Proxy.newProxyInstance 需要三个参数:
         *       第一个参数:类加载器
         *       第二个参数:接口列表
         *       第三个参数:实现了InvocationHandler的对象
         */
        UserDao proxyInstance = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
                userDao.getClass().getInterfaces(), this);
        return proxyInstance;
    }


    /**
     * 这里的 invoke 方法 在当前类的 任何一个方法被调用的时候,都会自动的执行。
     * 解释: Proxy.newProxyInstance 第三个参数 this 就是调用这个方法的。
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //获取方法的名称
        String name = method.getName();
        //增强 add 方法
        if("add".equals(name)){
            //在这里编写,需要增强的代码
            System.out.println("我是增强的代码....");
            //执行原来的方法
            Object result = method.invoke(userDao, args);
            return result;
        }
        //如果当前方法不是 add 方法,则直接执行原先的方法即可
        Object result = method.invoke(userDao, args);

        return result;
    }
}

3.测试代码
 

@Test
    public void testJDKProxy(){
        //创建代理类
        JDKProxy jdkProxy = new JDKProxy(new UserDaoImpl());
        //获得代理对象
        UserDao userDao = jdkProxy.creatProxy();
        //通过代理对象执行方法
//        userDao.add();  //运行结果:add方法被增强
        userDao.getUser("代先生"); //运行结果:getUser方法没有被增强

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值