SpringJDK动态代理

开课吧开课吧锤锤2021-08-10 11:09

SpringJDK动态代理需要实现InvocationHandler接口,重写invoke方法,客户端使用Java.lang.reflect.Proxy类产生动态代理类的对象。  

SpringJDK动态代理

示例  

下面使用EclipseIDE演示JDK动态代理,步骤如下:  

创建SpringDemo项目,并在src目录下创建net.kaikeba包。  

在net.kaikeba包下创建UserManager(用户管理接口)、UserManagerImpl(用户管理接口实现类)、MyAspect(切面类)和JdkProxy(动态代理类)。  

运行SpringDemo项目。  

UserManager类代码如下。  

package net.kaikeba;
public interface UserManager {
   
    // 新增用户抽象方法
    void addUser(String userName, String password);
    // 删除用户抽象方法
    void delUser(String userName);
}

UserManagerImpl类代码如下。  

package net.kaikeba;
public class UserManagerImpl implements UserManager {
    @Override
    public void addUser(String userName, String password) {
        System.out.println("正在执行添加用户方法");
        System.out.println("用户名称: " + userName + " 密码: " + password);
    }
    @Override
    public void delUser(String userName) {
        System.out.println("正在执行删除用户方法");
        System.out.println("用户名称: " + userName);
    }
}

MyAspect类代码如下。  

package net.kaikeba;
public class MyAspect {
    public void myBefore() {
        System.out.println("方法执行之前");
    }
    public void myAfter() {
        System.out.println("方法执行之后");
    }
}

MyAspect类在切面中定义了两个增强的方法,分别为myBefore和myAfter。  

JdkProxy类代码如下。  

package net.kaikeba;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* JDK动态代理实现InvocationHandler接口
*
* @author 开课吧
*
*/
public class JdkProxy implements InvocationHandler {
    private Object target; // 需要代理的目标对象
    final MyAspect myAspect = new MyAspect();
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        myAspect.myBefore();
        Object result = method.invoke(target, args);
        myAspect.myAfter();
        return result;
    }
    // 定义获取代理对象方法
    private Object getJDKProxy(Object targetObject) {
       
        // 为目标对象target赋值
        this.target = targetObject;
       
        // JDK动态代理只能代理实现了接口的类,从 newProxyInstance 函数所需的参数就可以看出来
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(),
                this);
    }
    public static void main(String[] args) {
        JdkProxy jdkProxy = new JdkProxy();    // 实例化JDKProxy对象
        UserManager user = (UserManager) jdkProxy.getJDKProxy(new UserManagerImpl());    // 获取代理对象
        user.addUser("kaikeba ", "https://www.kaikeba.com/");    // 执行新增方法
        user.delUser("kaikeba ");    // 执行删除方法
    }
}

运行结果如下。  

方法执行之前
正在执行添加用户方法
用户名称: kaikeba 密码: https://www.kaikeba.com/
方法执行之后
方法执行之前
正在执行删除用户方法
用户名称: kaikeba 
方法执行之后

以上就是开课吧广场小编为大家整理发布的“SpringJDK动态代理”一文,更多Java教程相关内容尽在开课吧广场Java教程频道!

开课吧广场Java教程

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享