自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(626)
  • 资源 (3)
  • 收藏
  • 关注

原创 java:基于spring的PathMatchingResourcePatternResolver实现基于包名(package)的类扫描

spring-core提供了资源扫描实现,可以获取到java程序运行时的所有类和其他资源,所以在spring环境下,也可以使用它来自己实现查找类的功能。调用示例:SpringResourceScannerTest.java。实现代码:SpringResourceScanner.java。

2024-04-23 17:41:34 96

原创 java:基于guava ClassPath工具实现基于包名(package)的类扫描

google的guava库提供了一个类路径扫描的实用工具ClassPath(参见说明: https://github.com/google/guava/wiki/ReflectionExplained#classpath)工具,适用于非android的Java平台搜索类。基于它可以设计一个过滤包名的搜索工具。实现代码:GuavaPackageScanner.java。

2024-04-23 16:06:19 642

原创 spring-core:理解@AliasFor注解的作用

AliasFor是spring注解体系中一个非常重要且基础的注解。顾名思义,它的基本作用就是为注解字段定义一个别名。

2024-04-20 12:38:26 478 1

原创 spring-core:获取类/方法/字段/字段上直接定义的注解

只要实现了java.lang.reflect.AnnotatedElement接口的对象(Class,Method,Field)都有这个方法,Class.getAnnotation获取注解对象,basePackages字段是空的,value字段才能获取正确的值。这个问题似乎不应该问,我们知道如果要获取一个类/方法/字段/字段上直接定义的注解是很方便的,如。Spring框架将注解(Annotation)用到了极致,对注解定义扩展了很多灵活了定义,所以在Spring框架下,要获取正确直接定义在类上的注解。

2024-04-19 11:08:59 261

原创 spring-core:注解合成(AnnotationUtils.synthesizeAnnotation)的使用示例

通过将包含了注解字段值的Map封装在动态代理(dynamic proxy)中,从Map提供的注释属性合成注释对象(Annotation),该动态代理实现指定注释类型的注释,并透明地强制使用@AliasFor注释的注释属性的属性别名语义。spring-core提供的AnnotationUtils工具功能很强大,也很灵活,其中的synthesizeAnnotation方法我一起没搞明白它的使用场景,直到今天我的工作用上了它,学会它的使用。就是根据Map对象定义的指定注解的字段的值 ,创建一个注解对象。

2024-04-18 13:56:33 220

原创 java:基于弱引用(WeakReference)的FunctionCached实现

以前写过一篇博客提到我基于guava的缓存(com.google.common.cache.LoadingCache)实现结果计算结果缓存的类FunctionCached。它很好的解决了常量结果重复计算问题。但最近我的应用场景有点变化。FunctionCached保存的结果有可能被多次重复使用,也有可能不再被继续使用。我希望这些不再被继续的使用数据能自动被回收,不要占用系统资源,如果万一它真的又被需要,就再次计算,并将结果缓存。

2024-04-17 16:30:16 393

原创 java:基于弱引用(WeakReference)封装Supplier实现数据根据需要自动加载

Java中的弱引用(WeakReference)是用来描述那些不会影响对象生命周期,但可能会在任何时候被垃圾收集器回收的对象引用。弱引用通常用于描述那些对象,它们非常重要,但又允许被自动回收。在现实应用场景中,有些数据我们一开始会在初始时使用,之后使用的频率会很低,但它又比较大。如果使用普通的引用,会常驻内存占用资源。这时弱引用就派上用场了。所以我们可以实现一个Supplier接口的类,封装一个弱引用实例。

2024-04-17 16:09:31 521

原创 spring-core:注解扫描工具MergedAnnotations获取复合注解上的元注解

介绍了通过AnnotatedElementUtils.hasMetaAnnotationTypes方法判断指定的AnnotatedElement对象(Class,Method,Field)是否是否用复合注解类型进行注解,而该复合注解是用annotationType指定的注解作元注解的。如何获取元注解对象呢?AnnotatedElementUtils并没有提供这个方法,但是参照。那么既然能判断是否存在元注解,能不能获取元注解对象呢?但它返回的是元注解的类名集合。的作元注解的复合注解。

2024-04-13 12:21:23 319

原创 spring-core:注解扫描工具AnnotatedElementUtils.hasMetaAnnotationTypes方法说明

hasMetaAnnotationTypes方法判断提供的AnnotatedElement对象(Class,Method,Field)是否用复合注解类型进行注解,而该复合注解是用annotationType指定的注解作元注解的。的作元注解的复合注解。

2024-04-13 12:16:42 392

原创 java:从spring-core移植的注解(annotation)扫描工具模组common-annotutils(适用JDK 1.7)

spring-core的部件组装基本原理是基于注解(annotation),通过扫描类、方法、成员上定义的注解来决定组装逻辑。这个注解扫描框架对于希望建立以注解组装机制的应用就很有用。但它是深度集成在spring-core代码中的。如果希望不依赖spring框架使用这个工具,只能自己想办法将包下的代码抽取出来使用,而我的项目需要在JDK 1.7环境下使用,我现在现在使用的spring-core 5.x版本最低要求JDK 1.8。所以。

2024-04-10 16:39:10 485 1

原创 jackson:JSON字符串(String)类型的成员序列化和反序列化

对于如下类型,props字段为JSON字符串(这在数据库经常用到),可以自由保存各种类型的数据输出这个结果如果送给前端并不友好,前端还需要再对props字段进行解析才能得到里面的值。

2024-03-23 16:25:50 755

原创 jackson:基于BeanDeserializer实现自定义的Java bean 解析器

如果能基于这个类实现自定义反序列化器,那么就可以利用它已有的成熟逻辑,代码实现上会简化,并且稳定和适应性也更好。但上面这种方式只适合已经知解析类型的场景,在一些特殊场景,比如不知道特定解析类型的场景,这个方法会有局限性。为参数的构造方法,调用者直接提供Java Bean的类,就可以实现构造方法。关于jackson实现自定义的对象解析器,最常用的方式就是继承顶级抽象类(字段的值受其他字段setter方法影响,所以下面的实现中先解析出。方法,就可以写继承BeanDeserializer 的子类了,

2024-03-22 14:55:56 683

原创 java:支持多种日期格式的Jackson自适应日期类型解析器实现

上一篇博客介绍了可以自适应解析多种日期格式的Fastjson的日期解析器实现,本文说明如何在Jackson下实现同的样的自适应日期解析器。jackson的标准解析器抽象类中已经提供了解析日期的实现方法(_parseDate其中方法已经提供了完善的TOKEN分析逻辑(如下),所以没必要从TOKEN识别开始做。只需要重写方法,对输入字符串尝试使用多种日期格式解析就可以了。

2024-03-21 14:13:04 562

原创 java:支持更多日期格式的fastjson日期解析器(ObjectDeserializer)实现

Fastjson内置的日期类型解析器(com.alibaba.fastjson.serializer.DateCodec)只支持ISO8601以及SQL标准日期格式(),但日期格式的常用种类也不少:比如 Date.toString()输出的这样的格式。除非在使用注解方式指定日期格式。否则Fastjson不能解析这样的格式。

2024-03-20 18:23:49 358

原创 java:java.util.BitSet对象的Jackson序列化和反序列化实现

是个非常方便的比特位数据存储和操作类,一个 bit 具有2个值:0和1,正好可以用来表示 false 和 true,适用于判断“数据是否存在”的场景。但是,这个从JDK1.0版本就存在的类,Jackson,Fastjson这些主流的JSON工具却并没有对它提供序列化和反序列化支持。》介绍了Fastjson实现,本文说明Jackson如何支持BitSet类型的序列化和反序列化。所以如果要在自己的数据结构中用到BitSet,就要自己实现序列化和反序列化。在反序列化阶段,根据TOKEN类型不同,将数据序列化为。

2024-03-20 10:45:26 244

原创 java:java.util.BitSet对象的Fastjson序列化和反序列化实现

是个非常方便的比特位数据存储和操作类,一个 bit 具有2个值:0和1,正好可以用来表示 false 和 true,适用于判断“数据是否存在”的场景。但是,这个从JDK1.0版本就存在的类,Jackson,Fastjson这些主流的JSON工具却并没有对它提供序列化和反序列化支持。所以如果要在自己的数据结构中用到BitSet,就要自己实现序列化和反序列化。主要思路就是在序列化过程中将BitSet的数据转为JSON数组(如。以下是BitSet对象的Fastjson序列化和反序列化实现,

2024-03-19 16:37:07 323

原创 java:将.或其他分割符分割的字符串分段从camel-case转为snake-case

比如有一个字符串.代表一个JSON子节点的路径。现在希望将它每个字段名如果是驼峰命名格式(camel-case)的就转为蛇形命名格式(snake-case)。我们知道guava库的CaseFormat提供了snake-case和camel-case之间的转换功能,使用很方便。但上面的字符串,如果直接用CaseFormat执行输出:这效果显然不是我们想要的,我希望的输出是解决的思路就是要对按分割分别进行处理,对全大写的字符串不做处理才行。

2024-03-15 10:30:50 369

原创 使用(?<!pattern) 负向后行断言正则表达式提取双引号开头和结尾的字符串

如下是一段java代码,我想用正则表达从中提取代码中的字符串java是通过前后用双引号包含定义字符串的。但简单使用正则表达式".*?是不可行的,因为会将中的\"识别为字符串边界引号而非字符串的一部分,如下为了解决\"误识别问题,就要用到(zero-width negative lookbehind assertion)即负向后行断言代表字符串中的一个位置,紧接该位置之前的字符序列不能匹配 pattern。例如对 “regex represents regular expression” 这个字符串,

2024-01-04 11:01:12 573

原创 conan入门(三十九):conan 2.x 引用第三方库示例

去年写过一篇博客,以一引用cjson为例介绍如何使用conan管理第三方库的引用,但是当时使的conan最新版本是1.45,这一年多conan经过了很多的版本迭代,目前最新版本已经是2.0.14。conan 1.0和2.0版本有很多的差异。所以原来的文章内容已经不适合2.0,本文在原文的基础上,还是以cjson为例介绍如何在2.0下引用第三方库。

2023-12-21 10:52:41 1308

原创 java:解决SPI机制遇到的非典型问题-ServiceLoad.load(Class<T> service)方法失效

太奇怪了,我无法解释,最有可能是的原因是客户的项目中的使用某种应用框架有自己的ClassLoader作为当前线程上下文的ClassLoader实例,.这个ClassLoader有BUG,找不到。这个问题解决了,但感觉是莫名奇妙,我查了很多关于第三方库及JDK的源码,关于SPI的使用方式都是调用。我们提供的DEMO程序在客户的设备上也能正常执行,但放在客户的项目代码中,就不行。方法,大家都是这么用的,到我这里却出了毛病,很难向客户证明这不是我们的问题。的方法说明,如果没有找到对应的文件,则返回空的对象。

2023-12-15 11:13:10 439

原创 conan 入门(三十八):conan二进制包的兼容性及自定义package_id的方式

conan二进制包的兼容性是指一个package是否可以满足当前profile中定义的settings,以及conanfile.py指定的options参数。默认情况下,conan在搜索一个依赖库匹配的二进制包(package)时,要求中所有参数都匹配,才算是一个兼容的包。conan会根据中提供的参数算出哈希值作为package_id。以确保二进制包的唯一性。简单说,的包就不能用于windows平台,同样,的包也不能用于msvc编译器。对于options。

2023-12-14 17:46:22 1007

原创 conan 入门(三十七):conan 2.x通过定义环境变量(environment)执行make编译只有Makefile的项目(erpcgen)

之前一篇博客介绍如何用实现来编译只有Makefile的项目,因为Autotools.make,Autotools.install方法就是执行make来编译项目。我原本是想用self.run来执行make进行编译的,因为去年编译erpcgen时,我就是用self.run来执行的(参见),那时conan 版本还是1.x,现在conan版本升级到2.x,不再兼容,原来的方式不能使用了,我一直没有搞明白如何合在conan 2.x下创建正确的环境变量,导致一直编译不成功。所以才摸索出用。

2023-12-13 17:48:57 982

原创 conan入门(三十六):在set_version方法中从pom.xml中读取版本号实现动态版本定义

因为版本号是写死的,所以这种方式有局限性:比如我的java项目中版本号是在pom.xml中定义的,c++项目是java项目的子项目,如果java项目版本号升级了,我每次发布java版本的时候都需要手工修改conanfile.py中的才能让c++子项目的版本号与java项目的版本号同步更新,虽然不复杂,但增加了维护工作量,容易忘记。所以如果conanfile.py中定义的版本号能自动与pom.xml中的版本号同步是最好的解决办法,conanfile.py中的方法用就是用于实现动态版本号定义。

2023-12-11 10:21:03 1103

原创 conan 入门(三十五):在conanfile.py中获取C++编译器完整路径的方法

有的项目windows平台下构建时需要在msys2环境编译,而msys2也是可以有内置的c++编译器的。如果msys2中的c++编译器与profile中定义的gcc编译版本不一致。那么项目编译阶段可以正常通过,但在连接过程就有可能报错。因为如果项目的依赖库有C++库,那么它是按profile中定义的编译器版本提供的,就可能会因为符号表不匹配产生找不到引用的连接错误(undefiend reference)。

2023-12-05 17:15:23 1029

原创 conan 入门(三十四):conan 2.x实现对只有Makefile的项目(erpcgen)的封装示例

一些已有的较老旧的项目只有Makefile,一般在Linux下编译,windows下编译需要借助cygwin或msys2,对于这样的项目如何实现conanfile.py使用conan进行构建呢?本文以erpc/erpcgen为例,说明实现步骤。是一个适用于嵌入式系统的开源RPC框架,erpc/erpcgen为其下的IDL编译器,编译基于Makefile.现在需要把它封装为conan的package.这就是我最近遇到的问题。下面我们分步说明实现的要点。

2023-12-02 17:18:50 1145

原创 conan 入门(三十三):requirements()指定header的可见性(transitive_headers)

不过conan包的头文件可见性只能传递一代,即只能传递直接引用包的项目,不能跨代传递。所以CMakeDeps generator为turbo-jpeg生成的cmake配置文件中定义的import target中没有将依赖库的头文件位置定义到。要解决这个问题,就是要更新jpegwrapper的conanfile.py中对于依赖库的定义方式,通过。conan 允许在conanfile.py的requirements()方法中手工指定依赖包的特性。类型的依赖包,库文件可以向下传递,但头文件对于下游默认不可见的。

2023-11-24 16:57:18 971

原创 conan 入门(三十二):package_info中配置禁用CMakeDeps生成使用项目自己生成的config.cmake

conanfile.py中定义的方法用于向package的调用者(conumer)提供包库名,编译/连接选项,文件夹等等信息,有了这些信息构建工具的generator就可以根据它们生成对应的文件,用于调用者引用package.比如基于cmake的CMakeDeps可以根据这些信息自动生成和调用者的CMakeLists.txt中通过就可以自动找到package.创建对应的import target.比如我为mnn 项目写的conanfile.py(

2023-11-24 11:26:25 1015

原创 conan入门(三十一):在命令行(shell)中从profile中读取配置参数

最近使用conan来执行本地或交叉编译时,我发现我需要知道当前profile定义的编译器的类型和版本以及平台,希望用profile中定义的os,arch,compier生成安装路径名如,该怎么实现呢?

2023-11-23 14:42:10 1082

原创 conan入门(三十):对腾讯ncnn进行Conan封装

是腾讯开源的一个为手机端极致优化的高性能神经网络前向计算框架。因为项目中需要用到它,所以我需要对它进行conan封装,以支持我们基于conan管理的项目的引用。ncnn代码比较成熟,项目结构清晰,对于conan封装的主要工作量就是将CMakeLists.txt脚本的option命令定义的开关在conanfile.py的options中定义为对应的conan 选项开关.

2023-09-26 14:06:20 268

原创 conan入门(二十九):对阿里mnn进行Conan封装塈conans.CMake和conan.tools.cmake.CMake的区别

去年写过一篇博客,当时通过自己写conanfile.py,实现了对第三方库cpp_redis的conan封装。当时使用的conan 1.45.0时过一年多,conan版本也经过了很多次升级,最新的版本是2.x,不过为了保持兼容现在我使用的版本是1.60.0。

2023-09-26 12:51:52 300

原创 conan入门(二十八):解决conan 1.60.0下 arch64-linux-gnu交叉编译openssl/3.1.2报错问题

大意就是编译器不支持arm架构,如下图看,编译器还是用的本机编译器,而不是armv8的交叉编译器aarch64-linux-gnu,解决了conan 1.60.0交叉编译boost/1.80.1的问题后,我继续交叉编译openssl/3.1.2时又报错了。我查看了boost/1.81.0的conanfile.py,确实在python脚本中创建并引用了。,而openssl/3.1.2的conanfile.py并没用引用。这个问题我在上一博客中明明已经解决了呀,不就是把profile中。来定义使用的编译器的,

2023-09-22 11:16:50 734

原创 conan入门(二十七):因profile [env]字段废弃导致的boost/1.81.0 在aarch64-linux-gnu下交叉编译失败

这个profile是我一年前写的,当时可以正确执行交叉编译,当然了,那个时候使用的conan 版本是1.45.0,一年多过去了,conan的版本迭代很快,目前我使用的是conan 1.x的接近最新版本1.60.0(1.x下当前最新版本是1.60.2),boost是由b2执行编译的,使用哪个编译器由环境变量CC来决定,CC定义在profile,所以问题应该出在profile.如下是执行aarch64-linux-gnu交叉编译使用的profile,的说明:从1.35.0开始新增加了这个字段,用于替换。

2023-09-22 10:50:08 706

原创 cmake:target属性POSITION_INDEPENDENT_CODE和INTERFACE_POSITION_INDEPENDENT_CODE的区别

cmake定义的target有两个名字类似的属性:`POSITION_INDEPENDENT_CODE`和`INTERFACE_POSITION_INDEPENDENT_CODE`,本文说明它们的含义和区别

2023-09-21 12:04:11 351 4

原创 kafka:java client使用总结塈seek() VS commitSync()的区别(三)

最近一段日子接触了kafka这个消息系统,主要为了我的开源中间件项目增加kafka支持(基于kafka-client【java】),如今总算完成,本文是对这个过程中对kafka消息系统的使用总结。

2023-08-07 16:41:22 1082

原创 kafka:消费者从指定时间的偏移开始消费(二)

但这个方案需要使用不常用的AdminClient类,而且如果该主题如果是第一次被消费者拉取消息时,因为得不到消费者的消费偏移,最后的结果,就是从0偏移开始拉取所有消息。并不能真正实现忽略上线之前所有消息的目的。为了忽略忽略掉上线之前的所有消息,从获取指定主题的所有消费者的消费偏移并计算出最大偏移来解决此问题。方法获取消费者的所有主题分区的指定时间的偏移,并将这个偏移作为消费开始的偏移(所以我又优化了方案。

2023-07-26 16:37:50 1388

原创 kafka:AdminClient获取指定主题的所有消费者的消费偏移(一)

在对消息系统的应用场景中,当有实时性要求时,希望忽略掉上线之前的所有消息,只从所有消费者最后的消费偏移读取消息。那么我们接收消息之前就需要知道其他消费者的当前消费偏移,计算出最大值,从最大的偏移开始读取消息。以下示例基于AdminClient获取指定消费主题的所有消费者的消费偏移。Kafka消费者上线时默认都是从上次消费的偏移开始读取消息。就好比加入微信群时,不会收进群之前的消息。

2023-07-26 12:31:03 460

原创 BeanShell:多线程环境下Interpreter解释器的优化使用

是用 Java 编写的一个小型、免费、可嵌入的 Java 代码的脚本解释器。BeanShell动态执行标准Java语法,并使用通用语法对其进行扩展 脚本编写便利性,适用于 Java 的轻量级脚本。本文说明在并发环境下对BeanShell更加优化的使用方式。

2023-07-02 18:56:19 502

原创 java:String正则表达式替换时对$符号的特别处理塈异常IllegalArgumentException:Illegal group reference

它们其实是对应调用的同名方法如果你仔细看它们的方法说明就会看到请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同;

2023-06-29 11:38:22 789

原创 BeanShell:检查变量是否为null的正确方式

是一个小型、免费、可嵌入的 Java 源代码 具有对象脚本语言功能的解释器,用 Java 编写。BeanShell动态执行标准Java语法,并使用通用语法对其进行扩展 脚本编写便利性,适用于 Java 的轻量级脚本。在Java中判断一个变量是否为null很简单的事儿null == v1BeanShell是一个支持Java语法的的脚本解释器,按道理null == v1也是支持的,我一直是这么理解的, 大量测试也没问题。但是今天在写单元测试时,因为手误,在解释器执行脚本时没有为变量v1定义值。

2023-06-23 00:23:10 632

原创 java:使用guava提供的IntMath.gcd方法计算最大公约数

google开源库guava提供了计算最大公约的方法,使用非常简单

2023-05-16 18:35:32 137

CMake脚本在ultraedit中的语法高亮支持

资源来自CMake官网: http://www.cmake.org/Wiki/images/5/56/UltraEditWordfile.tar.gz, 但这个链接已经无法访问,从历史快照中找加,上传备份 参见使用方法参见:https://blog.csdn.net/10km/article/details/52368486

2023-06-08

erpcgen-windows-x86_64.zip

用cygwin编译的erpcgen,可以windows下直接通过IDL编译生成client/server端(C++)代码,有cygwin的童鞋也可以自行编译,很方便的。 erpc git仓位置: https://github.com/EmbeddedRPC/erpc

2020-09-17

windows下MSVC兼容的dirent.h

<dirent.h>是一个应用程序接口,主要用于文件系统的目录读取操作,主要提供了几个目录数据读取函数,<dirent.h>是unix系统下常见的接口,但windows平台的MSVC编译器并没有提供这个接口( Cygwin5 and MingW现在已经提供了dirent接口),对于跨平台的项目开发就会带来一些麻烦,如果在MSVC下编译时可能因为windows平台缺少这个接口就要为windows平台另外写一些代码。本资源是从网上找的,提供了windows下为MSVC实现的dirent.h接口实现,方便跨平台开发和移植。

2016-03-31

libb64--base64编码解码库

libb64是实现base64编码解码的开源库,还提供了C++封装,用起来挺方便

2016-03-31

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除