jdk动态代理代码实现

news/2024/7/7 22:23:01 标签: java, 开发语言

1、jdk动态代理代码实现

1、接口
java">public interface IUserService {

    void save();

   void delete();

}
2、接口实现
java">@Service
public class UserServiceImpl implements IUserService {

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

    @Override
    public void delete() {
        System.out.println("UserServiceImpl.delete");
    }
}
3、代理类创建
java">@Test
public void testJdkProxy(){

    //使用jdk动态代理生成 代理对象
    IUserService userServiceProxy = (IUserService) Proxy.newProxyInstance(
        this.getClass().getClassLoader(),   //类加载器
        userService.getClass().getInterfaces(), //给接口proxy 才可以生产代理
        new InvocationHandler() {  //代理对象执行的接口
            //代理对象 反射执行的方法
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                //这里进行增强
                System.out.println("log 日志输出" + method.getName());

                //真实对象执行 delete、save的方法
                Object obj = method.invoke(userService,args);

                return obj;
            }
        }
    );

    System.out.println("userServiceProxy = " + userServiceProxy);
    userServiceProxy.save();
    userServiceProxy.delete();
}
4、原理

1、使用工具类生产代理对象 字节码

java">public class ProxyUtils{
	
	public static void main(String[] args) throws Exception {
        saveProxyFile();
    }
	
	private static void saveProxyFile() throws IOException {

        IUserService userService = new UserServiceImpl();

        FileOutputStream out = null;
        File file = new File("C:\\test\\" + "$Proxy0.class");
        file.createNewFile();
        try {
            byte[] classFile = ProxyGenerator.generateProxyClass(
			"$Proxy0",
                    userService.getClass().getInterfaces());
            out = new FileOutputStream(file);
            out.write(classFile);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.flush();
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2、源码分析
image-20240704151808128


http://www.niftyadmin.cn/n/5535512.html

相关文章

[数据集][目标检测]电缆钢丝绳线缆缺陷检测数据集VOC+YOLO格式1800张3类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1800 标注数量(xml文件个数):1800 标注数量(txt文件个数):1800 标注…

C++(Python)肥皂泡沫普拉托边界膜曲面模型算法

🎯要点 🎯肥皂泡二维流体模拟 | 🎯泡沫普拉托边界膜曲面模型算法演化厚度变化 | 🎯螺旋曲面三周期最小结构生成 📜皂膜用例:Python计算物理粒子及拉格朗日和哈密顿动力学 | Python和MATLAB粘性力接触力动…

Matplotlib 文本

可以使用 xlabel、ylabel、text向图中添加文本 mu, sigma 100, 15 x mu sigma * np.random.randn(10000)# the histogram of the data n, bins, patches plt.hist(x, 50, densityTrue, facecolorg, alpha0.75)plt.xlabel(Smarts) plt.ylabel(Probability) plt.title(Histo…

数字化工厂EasyCVR视频监控智能解决方案:引领工业4.0时代新趋势

随着工业4.0的深入发展和数字化转型的浪潮,数字化工厂视频监控智能解决方案成为了现代工业生产中不可或缺的一部分。这一解决方案集成了先进的视频监控技术、人工智能(AI)和大数据分析,为工厂提供了更高效、更安全、更智能的监控和…

docker -run hello-world超时

主要原因就是尝试拉取库的时候没有从阿里云镜像里拉&#xff0c;所以设置一下就好了 这里使用的是ubuntu系统&#xff08;命令行下逐行敲就行了&#xff09; sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": [&quo…

竞品测试 埋点自动化

明确目标-以终为始&#xff1a;对标竞品&#xff0c;挖掘出竞品使用率高于ks的原因&#xff0c;从而找出技术/产品的优化方案选择竞品&#xff1a;市场份额、产品定位、应用表现确认分析维度&#xff1a;CPU、GPU、内存占用、电量消耗、功率消耗、UI层帧率&#xff1b;从功能属…

-bash: /snap/bin/docker: 没有那个文件或目录

-bash: /snap/bin/docker: 没有那个文件或目录 解决办法 export PATH$PATH:/usr/bin/docker然后&#xff0c;重新加载配置文件 source ~/.bashrc

2024年第十四届APMCM亚太地区大学生数学建模竞赛

C 题 基于量子计算的物流配送问题 随着电子商务的迅猛发展&#xff0c;电商平台对物流配送的需求日益增长。为了确保货物能够按时、高效地送达消费者手中&#xff0c;电商平台与第三方物流公司建立了紧密的合作关系。然而&#xff0c;面对大量的货物和多样的目的地&#xff0c…