Java动态代理

本文介绍了一个使用Java动态代理(JDK Proxy)为业务接口PersonService创建代理对象的例子,并通过JUnit进行测试验证。该示例展示了如何通过实现InvocationHandler接口来创建代理类,以及如何在测试中利用代理对象调用业务方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、业务接口

 

package com.sgl.service;

public interface PersonService {
    void save();

    void update(Integer personID, String name);

}

 

2业务接口层实现

package com.sgl.service.imp;

import com.sgl.service.*;

public class PersonServiceBean implements PersonService {//业务bean

    private String user = null;

    public PersonServiceBean() {
    }

    public PersonServiceBean(String user) {
        this.user = user;
    }

    public String getUser() {
        return user;
    }
  
    public void update(Integer personID, String name) {
        System.out.println("已经更新了");
    }

    public void save() {
        System.out.println("我是Save()方法");
    }
}

 

3、代理工厂

package com.sgl.aop;

import com.sgl.service.imp.PersonServiceBean;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JDKProxyFactory implements InvocationHandler {

    private Object targetObject;//被代理类的原始实例

    public JDKProxyFactory(Object targetObject) {
        this.targetObject = targetObject;
    }

    public JDKProxyFactory() {
    }

    /**
     * 由被代理类的实例targetObject来创建代理对象,代理对象实质是被代理类的实例
     * @param targetObject
     * @return
     */
    public Object createProxyInstance(Object targetObject) {
        /**
         * newProxyInstance()方法
         * 第一个参数是被代理类的加载器
         * 第二个参数是被代理类接口所实现的所有方法
         * 第三个参数表示由哪个代理类处理
         */
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
                targetObject.getClass().getInterfaces(), this);
    }

    /**
     * 访方法被自动调用,invoke的所有参数在代理对象调用业务方法时,自动赋值
     * @param proxy 代理对象
     * @param method 被代理的方法
     * @param args 被代理方法的参数
     * @return
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        PersonServiceBean personBean = (PersonServiceBean) this.targetObject;
        if (personBean.getUser() != null) {//如果有权限
            result = method.invoke(this.targetObject, args);//代理类将方法调用委派给目标对象来调用
        }
        return result;
    }
}

4、JUnit测试类(JUnit 4.x)

 package junit.test;

import com.sgl.aop.JDKProxyFactory;
import com.sgl.service.PersonService;
import com.sgl.service.imp.PersonServiceBean;
import org.junit.Test;
public class PersonProxyTest {

    @Test
    public void proxyTest() {
       PersonServiceBean personBean = new PersonServiceBean("史贵岭");
        JDKProxyFactory jDKProxyFactoryObject = new JDKProxyFactory(personBean);
        PersonService proxy = (PersonService) jDKProxyFactoryObject.createProxyInstance(personBean);
        proxy.save();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值