手写JAVA动态代理

Ubuntu 解决WPS缺少宋体,微软雅黑等中文字体 这篇博客解决Ubuntu 18.04 无法使用中文字体的问题 问题描述 阅读详情

代码目录:

具体类:

public interface UserDao {

    public void query(String s);
}
public class UserDaoImpl implements UserDao{

    private UserDao userDao;

    public UserDaoImpl(){

    }

    public UserDaoImpl( UserDao userDao){
        this.userDao = userDao;
    }

    public void query(String s){
        System.out.println("query");
    }
}

 

/**
 * @author wufei
 * @create 2018-12-17 15:51
 **/
public class ProxyUtil
{
    public static   Object newInstance(Class targetInfo) throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException {
        StringBuilder context  = new StringBuilder();

        String line = "\n";
        String tab = "";
        //包名
        String packageContext = "package com.wf.springdemo.proxy;"+line;
        //导入包名
        String importContext = "import "+targetInfo.getName()+";"+line;

        String targetNameInfo = targetInfo.getSimpleName();
        //代理类名
        String proxyClassName = "public class $Proxy implements "+targetNameInfo+"{"+line;

        String fieldContext = "private "+targetNameInfo+" target;"+line;
        //构造函数
        String constructorContext = "public  $Proxy  ("+targetNameInfo+" target){" +line+
                "this.target = target; "+line+"}"+line;

        //方法
        String methodContext = "";
        Method[] methods = targetInfo.getDeclaredMethods();
        for (Method method : methods) {
            //方法返回值类型
            String methodReturnType = method.getReturnType().getName();
            //方法名
            String methodName = method.getName();

            //参数类型
            Class[] parameterTypes = method.getParameterTypes();
            String argsContext = "";
            //参数名称
            String parameterName="p";
            int p =1;
            for (Class parameterType : parameterTypes) {
                //String p1, String p2
                parameterName = parameterName+p;
                argsContext=parameterType.getSimpleName()+" "+parameterName+"";
                p++;
            }
            //取出逗号,
            System.out.println("argsContext = [" + argsContext + "]");

            String argsContext1 = "";
//            if(argsContext.length()>0){
//                argsContext1=   argsContext.substring(0,argsContext.lastIndexOf(",")-1);
//            }

            methodContext +="public "+ methodReturnType+" "+methodName+"("+argsContext+"){"+line
                         +"System.out.println(\"query\");"+line  //业务逻辑比较复杂了 不处理了
                          +"target."+methodName+"("+parameterName+");"+line+"}"+line;
        }


        context.append(packageContext);
        context.append(importContext);
        context.append(proxyClassName);
        context.append(fieldContext);
        context.append(constructorContext);
        context.append(methodContext);
        context.append(line+"}");
        System.out.println("result: \n"+context.toString());

        //输出到磁盘,jdk是内存上
        File file = new File("D:\\test\\$Proxy.java");
        if(file.exists()){
            file.createNewFile();
        }
        FileWriter fileWriter = new FileWriter(file);
        fileWriter.write(context.toString());
        fileWriter.flush();
        fileWriter.close();


        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        StandardJavaFileManager standardJavaFileManager =  compiler.getStandardFileManager(null,null,null);
        Iterable units = standardJavaFileManager.getJavaFileObjects(file);
        JavaCompiler.CompilationTask t = compiler.getTask(null,standardJavaFileManager,null,null,null,units);
        t.call();
        standardJavaFileManager.close();

        URL[] urls = new URL[]{new URL("file:d\\\\")};

        URLClassLoader urlClassLoader = new URLClassLoader(urls);
        Class aClass = urlClassLoader.loadClass("com.wf.springdemo.proxy.$Proxy");
        return    aClass.newInstance();
    }

}

 

public class Main {
    public static void main(String[] args) {
        try {
            UserDao userDao = null;
            try {
                userDao = (UserDao) ProxyUtil.newInstance(UserDao.class);
                userDao.query("ok");

            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

 

生成的代理类:

package com.wf.springdemo.proxy;
import com.wf.springdemo.proxy.UserDao;
public class $Proxy implements UserDao{
private UserDao target;
public  $Proxy  (UserDao target){
this.target = target; 
}
public void query(String p1){
System.out.println("query");
target.query(p1);
}

}
GAN网络详解析 介绍目前常见的GAN网络,以及GAN网络的基本组成 阅读详情

相关推荐

钉钉开发(三)——Java推送钉钉待办任务

之前一篇博文中,讲解了如何推送钉钉群消息,感兴趣的可以点击查看。 钉钉开发(一)——Java给钉钉群推送消息

Monten_Cristo的博客 6412

不用JDK的动态代理,手写JDK动态代理

App ClassLoader实现步骤:继承ClassLoader并覆盖findClass。实现newProxyInstance共五个步骤。

忆亦何为的博客 701

从零到一:Mx_yolo本地训练与K210部署实战指南

本文详细介绍了从零开始进行Mx_yolo本地模型训练到K210部署的全流程实战指南。涵盖环境配置、数据准备、模型训练与调优、模型转换及K210部署等关键步骤,并提供了常见问题解决方案和性能优化技巧,帮助开发者高效完成AI模型在嵌入式设备的落地应用。

weixin_29081163的博客 252

Java 动态代理详解:利用动态代理手写一个简单的OpenFeign

动态代理通过运行时生成代理类,实现代码增强和解耦,是 Java 高级编程和框架设计的核心技术。它在 AOP、RPC、ORM 等场景中广泛应用,如 Spring、MyBatis、Feign 等框架均依赖动态代理实现核心功能。使用时需注意接口限制、性能影响及代理对象的特殊性,合理选择代理方式(JDK Proxy 或 CGLIB)以适配业务需求。

千层冷面的博客 1170

VirtualLab初学者教程-1.用户界面

目录前言一、VirtualLab Fusion简介1.软件2.内置工具箱:二、用户界面认识1.上方菜单栏2.右侧面主窗口3.底部窗口附 前言 感觉做VirtualLab的资料不是特别多,可能用的朋友也比较少吧,笔者最近也因为大创需要刚刚开始入门,把网上有的英文资料整理了一下,加了一点自己的内容发出来希望帮助更多在学习中的朋友,有用词不当之处还请多多包涵。 一、VirtualLab Fusion简介 因为是第一讲,简单啰嗦一下软件本身,参考官方介绍。 1.软件 VirtualLab是由德国LightTran

ClaireTang1的博客 2万+

从硅片到时钟:揭秘SiTime MEMS谐振子的精密制造之旅

本文深入解析了SiTime MEMS谐振子的精密制造工艺,从硅晶圆的提纯到DRIE深硅刻蚀,再到真空封装技术,揭示了其如何克服传统石英晶振的局限。通过对比测试数据,展示了MEMS谐振子在精度、可靠性和生产效率上的显著优势,特别是在5G基站和汽车电子等领域的应用潜力。

weixin_42522953的博客 404

手写Java动态代理

博客内容来自笔者微信公众号。 动态代理又包括JDK代理和CGLIB代理。 MyBatis框架就用到了动态代理技术,我们只关心Dao接口,而无需关心实现类。 动态代理功能十分强大,今天记录一下本人 手动实现动态代理的过程。 分析 要如何对一个类对象进行代理呢? 首先当然是要分析被代理对象,解析它的方法,然后动态的生成一个子类,对父类方法进行重写。 拦截方法,将方法的运行交给代理对象去完成,然后在...

程序员小潘 3512

GD32F450以太网(1):ETH 外设接口简介

GD32F450以太网ETH MAC外设接口简介

Zhichao_Zhang的博客 1万+

自定义手写JDK动态代理

根据Java Porxy 实现原理实现我们手写的自定义代理类,实现简易的动态代理流程。

代码缔造者的博客 399

【3】 灰度变换(1)

第三章(1)【总三】

课题分离 660

【ROS2】机械臂MoveIt2

navigation2 专注于移动机器人的导航与定位,处理大范围空间的底盘运动;MoveIt2 专注于机械臂的操作规划,处理多关节协同的末端执行器运动。在复合机器人(如,移动机械臂)navigation2 负责移动到目标区域,MoveIt2 负责机械臂抓取。官网:https://moveit.picknik.ai/main/index.html。

郭老二 602

手写JDK动态代理

在手写JDK动态代理实现之前,我们先看一下我们平时是怎么用的。 举个例子,你想找对象,但是没有时间,只能委托媒婆去帮你找,代码实现如下: // 一个统一接口 public interface Person { // 找对象接口 void findLove(); } // 客户类 public class Customer implements Person{ @Override public void findLove() { System.ou

SDAUguo的博客 767

第55篇:数据隐私保护技术盘点——差分隐私、同态加密与它们的坑(踩坑总结)

数据隐私保护是AI工程化中必须严肃对待的课题。差分隐私和同态加密是两把利器,但也都是“重武器”,使用不当反而会伤及自身。差分隐私像“模糊处理”,通过加噪来保证统计安全性,要小心管理隐私预算和效用权衡。同态加密像“保险箱里打算盘”,保证了计算的精确性,但必须承受巨大的性能和工程复杂度代价。我的建议是:从小规模实验开始,先用DP-SGD在MNIST/CIFAR-10等标准数据集上感受噪声与精度的关系;再用TenSEAL等易用的库尝试一个加密逻辑回归,体会密文膨胀和速度延迟。

ai_blue_pm的博客 281

Java动态代理的应用:手写简易RPC框架

动态代理其实是一种方便运行时候动态的处理代理方法的调用机制,通过代理可以让调用者和实现者之间解耦。比如RPC框架需要远程调用其他服务器上的方法,使用动态代理可以屏蔽底层的序列化,网络通信等细节操作,简化调用者的操作。

qq_42715100的博客 300

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

手写动态代理--java

首先明确代理模式是一个类的方法不能直接使用,我们在客户端和目标对象之间创建一个中介,这个中介就是动态代理,例如租房者,中介和房东之间,租房者通过中介访问房东。在程序执行的过程中创建代理类对象,在创建过程中利用反射机制来实现的。即为在使用过程中利用JDK提供的方法才会创建对象。动态代理的实现有两种:JDK动态代理:使用jdk字节的类,利用反射实现的代理,反射包Java.lang.reflect包括三个类:Proxy,Method和InvocationHandler。

Artisan_w 869

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深入理解Java的动态代理机制,手写一个简易的动态代理

手写一个动态代理

gwndjsh的博客 644

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java AOP的实现原理和手写实现,支持JDK动态代理,Javassist代理,Cglib代理

Java AOP的实现原理和手写实现,支持JDK动态代理和Cglib代理 概述 面向切面编程已经在我们的平常工作中经常会用到, 平常我们在使用的都是使用spring封装的aop模块, 使用的时候只要配置几个注解就能实现逻辑了,非常的方便. 但是使用的方便也就意味着其封装的复杂, 另外spring的aop也是有其的演进,从最早的只能通过实现接口+xml配置,到现在@Aspect的支持来实现声明式的变...

cdy1996的博客 502

Java动态代理概述和手写实现动态代理

一:前提 Spring中最重要的两种思想:控制反转IOC(Inversion of Control)和面向切面编程AOP(Aspect-Oriented Programming),而AOP最重要的原理就是动态代理,今天我们谈一下动态代理。动态代理顾名思义是代替别人做某些事,它自己不干,让代理帮他做。别的不多说,直接上代码(举的例子可能不恰当)! 二:基于JDK的动态代理 1:因为Java的动...

java1_boy的博客 793

Java手写动态代理,模拟动态代理,任意逻辑动态代理

实现思路 1.字符串拼接生成一个Java文件 2.用IO流输出到磁盘 3.运行时编译 4.执行动态代理 自己写的动态代理只用于理解JDK动态代理的思想, 无其他用处, 目前可以实现任意逻辑的代理,执行前和执行后 执行效果 源代码:: 码云. ...

不骄不傲的博客 162

Java设计模式-代理模式(附手写简易版JDK动态代理实现)

以上就是代理模式的全部内容,希望能帮助大家理解代理模式。

aloshuwa的博客 925

java 手写动态代理

动态代理,在方法的前后增加日志功能

djh_it的博客 731

精讲23种设计模式-001:纯手写Java动态代理模式

001:纯手写Java动态代理模式1 代理设计模式基本概念与应用场景2 实现静态代理两种方式3 静态代理与动态代理模式的区别4 基于JDK动态代理的使用5 为什么Jdk动态代理不能用子类接收6 JDK生成的代理类$Proxy源码分析7 手写JDK动态代理 1 代理设计模式基本概念与应用场景 课程内容 代理模式为何是程序员必备技能 静态代理与动态代理实现区别 Jdk动态代理为何需要InvocationHandler接口 CGLIB动态代理与Jdk动态代理区别 10分钟完全纯手写一个Jdk动态代理 代理设计

枫火的博客 840

手写实现动态代理

一般来说最常见的动态代理是这么写的: 1,正常版本 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class JDKProxy implements InvocationHandler { private Obje...

huffmanT的博客 943

深入理解JDK动态代理《从手写模拟到源码剖析》

目录   一.java代理模式的实现   二.手写模拟JDK动态代理   三.JDK动态代理源码剖析 正题 一、java代理模式的实现   1.java中代理模式的实现方式 java代理分静态代理和动态代理,java静态代理实现有两种:继承,聚合。java动态代理实现有两种:JDK动态代理,CGLIB代理。   2.静态代理和动态代理的主要区别和特...

qq_43519310的博客 643

[Java|面试] 面试被问Java的动态代理机制,能说说吗

Java的动态代理机制 文章目录Java的动态代理机制0. 什么是代理1.动态代理和静态代理的区别2. 使用代理的情况3. 动态代理的构成4. JDK中的动态代理5. 手写一个JDK动态规划的demo6. 总结 0. 什么是代理 代理是基本的设计模式之一,它是你为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象。 这些操作通常涉及与“实际”对象的通信,因此代理通常充当着中间人的角色。 代理这种设计模式是通过不直接访问被代理对象的方式,而访问被代理对象的方法。 从Java面向对象编程的角度,代理模

喜欢前端的后端 MelodyJerry 1万+

代理模式及手写模拟jdk动态代理

什么是代理 简而言之,代理就是增强一个对象的功能。目标对象,指被增强对象,代理对象,指增强后的对象。 java实现代理的两种方法 静态代理 继承 代理对象继承目标对象,重写需要增强的方法; 缺点:会代理类过多,非常复杂 聚合 目标对象和代理对象实现同一个接口,代理对象当中要包含目标对象。 缺点:也会产生类很多,只不过比继承少一点点 总结:如果在不确定的情况下,尽量不要去使用静态代理。 动态代理 ...

xianmingsu的博客 288
上一篇: IDE快捷键常用
下一篇: 手写HashMap
wflovejava
博客等级 码龄11年 23粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值