java
文章平均质量分 64
yangyangrenren
这个作者很懒,什么都没留下…
展开
-
单元测试通过Mockito修改方法的入参
mockito修改入参转载 2022-11-13 20:15:33 · 2615 阅读 · 1 评论 -
使用Mockito mock一个静态方法
mockito 静态方法转载 2022-11-13 20:14:00 · 7042 阅读 · 0 评论 -
RocketMQ-单机版安装与启动详细步骤
rocketmq的安装及管理控制台安装转载 2022-10-30 13:12:45 · 1724 阅读 · 0 评论 -
spring的maven依赖
spring的pom.xml配置转载 2022-09-30 18:16:35 · 1333 阅读 · 0 评论 -
Mac下Java JNI 调C
java调用native方法转载 2022-06-04 17:48:00 · 249 阅读 · 0 评论 -
springboot多数据源连接数据库
方式一:不同的mapper对应不同的数据源参考文章:springBoot + Hikari 配置多数据源连接数据库快速配置多数据源(整合MyBatis)方式二:动态切换数据源spring boot使用AbstractRoutingDataSource实现动态数据源切换继承AbstractRoutingDataSource再通过AOP实现动态数据源切换AbstractRoutingDataSource 只支持单库事务,也就是说切换数据源要在开启事务之前执行。 spring DataSourceTr原创 2022-03-29 09:31:51 · 1153 阅读 · 0 评论 -
springboot-starter中的SPI 机制
SPI的全称是Service Provider Interface, 直译过来就是"服务提供接口", 听起来挺别扭的, 所以我试着去就将它翻译为"服务提供商接口"吧.我们都知道, 一个接口是可以有很多种实现的. 例如搜索,可以是搜索系统的硬盘,也可以是搜索数据库.系统的设计者为了降低耦合,并不想在硬编码里面写死具体的搜索方式,而是希望由服务提供者来选择使用哪种搜索方式, 这个时候就可以选择使用SPI机制.SPI机制被大量应用在各种开源框架中,例如:大家都熟悉的dubbo中的ExtensionLoad翻译 2022-02-15 22:49:36 · 948 阅读 · 0 评论 -
spring-namespace实现自己的自定义标签类
转载于:spring-namespace实现自己的自定义标签类、spring-namespace自定义命名空间简介我最开始是通过sharding-sphere这个分库中间件知道,在做中间件的时候,最好是使用这种spring-namespace的方式进行配置。之后,在比较流行了一些java中间件中都会发现spring-namespace的影子,比如dubbo中的xml配置文件 <dubbo:application name="demo-provider"/> <dubbo:r转载 2022-02-15 22:36:51 · 236 阅读 · 0 评论 -
springboot-dubbo——解决运行就马上关闭的问题
转载于:springboot-dubbo——解决运行就马上关闭的问题解决方案:1、在入口处添加System.in.read()进行阻塞,防止直接挂(不推荐)public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); try { //阻塞作用,否则会由于不是web项目,转载 2022-01-16 11:59:23 · 588 阅读 · 1 评论 -
JNDI注入高版本绕过——实验分析
原文是:JNDI注入高版本绕过JNDI注入高版本绕过对文章中的“利用LDAP返回序列化数据,触发本地Gadget绕过高版本限制”内容,LDAP_Server代码做实验,其原理就是:启动了一个内存LDAP数据库。LDAP内存数据库验证:可以采用两种方式验证,方式一是借助Apache Directory Studio软件,与内存LDAP数据库建立连接。方式二是使用代码读取。(1) 方式一(2)方式二import javax.naming.Context;import javax.nami原创 2021-12-22 23:50:09 · 2601 阅读 · 0 评论 -
JNDI注入高版本绕过
转载于JNDI注入高版本绕过JDNI利用方式的修复之路RMI Remote Object Payload(限制多,不常使用)攻击者实现一个RMI恶意远程对象并绑定到RMI Registry上,编译后的RMI远程对象类可以放在HTTP/FTP/SMB等服务器上,供受害者的RMI客户端远程加载。RMI客户端在 lookup() 的过程中,会先尝试在本地CLASSPATH中去获取对应的Stub类的定义,并从本地加载,然而如果在本地无法找到,RMI客户端则会向远程Codebase去获取攻击者指定的恶意对象,这转载 2021-12-22 23:15:53 · 1815 阅读 · 0 评论 -
Java ScriptEngineManager
ScriptEngineManager1、ScriptEngineManager是JDK6提出的相关方法,这方式的主要目的就是用来对脚本语言的处理。这里只是简单介绍一下对我们常用的数学公式的应用。2、ScriptEngineManager是在java的javax.script的包下,是Java原生提供的脚本语言处理方法。3、这里一个简单的demo,供参考import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;原创 2021-12-19 23:07:45 · 4015 阅读 · 0 评论 -
java操作LDAP示例
提供了两个例子,一个是CRUD功能。另外一个是利用查询LDAP实现用户的登录验证功能。完全借鉴的Java到LDAP教程、JAVA中使用LDAP登录的三种方式java在LDAP上进行CRUD现在可以从Java程序访问LDAP。 向您展示如何执行此操作的最佳方法是通过示例程序。 该程序将执行以下任务:创建一个新的LDAP对象查看LDAP对象将新属性添加到LDAP对象修改LDAP对象上的属性删除LDAP对象上的属性删除LDAP对象注意:此类在其自身之后进行清除,即它将LDAP Server保转载 2021-12-18 20:34:05 · 5333 阅读 · 0 评论 -
log4j2漏洞复现
1、本地启动ldap服务https://github.com/veracode-research/rogue-jndi下载这个链接的源码进行编译mvn package -DskipTests启动命令:#这里172.19.60.23是我本地的ip java -jar target/RogueJndi-1.1.jar -c "calc" -n 172.19.60.23说明:原作者这里使用过的是 calc,应该是在windows系统上实验的。在ubuntu以及mac上,使用calc是不行的。在ma转载 2021-12-17 00:38:41 · 1140 阅读 · 0 评论 -
为什么不推荐使用BeanUtils属性转换工具
转载于:为什么不推荐使用BeanUtils属性转换工具1 背景之前在专栏中讲过“不推荐使用属性拷贝工具”,推荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。不推荐的主要理由是:有些属性拷贝工具性能有点差有些属性拷贝工具有“BUG”使用属性拷贝工具容易存在一些隐患(后面例子会讲到)2 示例首先公司内部就遇到过 commons 包的 BeanUtils 进行属性拷贝性能较差的真实案例,然后该同事换成了 Spring 的 BeanUtils 性能好了很多,感兴趣大转载 2021-11-30 00:09:57 · 125 阅读 · 0 评论 -
我什么时候应该使用 THREAD.GETCONTEXTCLASSLOADER()?
我什么时候应该使用 THREAD.GETCONTEXTCLASSLOADER()?这个问题经常出现在编写框架代码 , 需要动态加载很多类和资源的时候 . 通常当你需要动态加载资源的时候 , 你至少有三个 ClassLoader 可以选择 :系统类加载器或叫作应用类加载器 (system classloader or application classloader)当前类加载器当前线程类加载器上面的问题指的是最后一种类加载器 . 哪种类加载器是正确的选择呢 ?第一种选择可以很容易地排除 : 系转载 2021-11-28 17:15:13 · 218 阅读 · 0 评论 -
使用自定义ClassLoader解决反序列化serialVesionUID不一致问题
转载于:使用自定义ClassLoader解决反序列化serialVesionUID不一致问题0x01 背景serialVesionUid不一致导致反序列化失败也算是Java反序列化漏洞利用比较常见的问题了。查了下资料,发现了各种各样的方法,但没有找到一种适合所有gadget的通用解决方案,为此我花了一些时间,算是找到了自己心中比较完美的解决方案:自定义ClassLoader。目前已经将其集成到ysoserial中,可完美解决各类gadget serialVesionUID不一致问题。0x02 各方案的转载 2021-11-28 17:08:47 · 542 阅读 · 0 评论 -
关于ClassLoader.getSystemClassLoader()和Thread.currentThread().getContextClassLoader()
今天碰到一个问题,我做了一个动态编译的程序,但在javaSE环境直接运行(即javaApplication状态)可以运行,但在tomcat服务器上通过请求来处理就不行,提示找不到我动态生成的类:关键语句如下(报错时我写的是:return ClassLoader.getSystemClassLoader())最后我发现写成如图这样,调用Thread.currentThread().getContextClassLoader().loadClass(name);,就不会报错了。查询资料后解释如下:Cl转载 2021-11-28 12:05:25 · 674 阅读 · 0 评论 -
tomcat
tomcat相关的源码解析深入理解 Tomcat(一)源码环境搭建和 How Tomcat works 源码深入理解 Tomcat (二) 从宏观上理解 Tomcat 组件及架构深入理解 Tomcat(三)Tomcat 底层实现原理深入理解 Tomcat(四)Tomcat 类加载器之为何违背双亲委派模型深入理解 Tomcat(五)源码剖析Tomcat 启动过程----类加载过程深入理解 Tomcat(六)源码剖析Tomcat 启动过程----生命周期和容器组件深入理解 Tomcat(七)源码剖转载 2021-11-28 11:58:01 · 102 阅读 · 0 评论 -
运用URLClassLoader加载外部jar包的java类,生成Class文件
转载于:运用URLClassLoader加载外部jar包的java类,生成Class文件先来一段网上copy的话术: //****************************很多时候 我们写的java程序是分模块的,有很好的扩展机制,即我们可以为我们自己的java类添加插件,来运行将来某天我们可能开发出来的类,以下称这些类为插件类。下边是一种简单的实现方法:Class A 作为程序的主入口,其中包含了程序的执行入口(main)函数。然后在main函数中通过外部的配置文件,然后通过外部的配置转载 2021-11-21 22:38:04 · 5202 阅读 · 0 评论 -
线程上下文类加载器
转载于深入理解Java类加载器(1):Java类加载原理解析 、 深入理解Java类加载器(2):线程上下文类加载器1、JVM三种预定义类型类加载器启动(Bootstrap)类加载器、扩展(Extension)类加载器、系统(System)类加载器。public class LoaderTest { public static void main(String[] args) { try { System.out.println(ClassLoade转载 2021-11-16 23:54:53 · 626 阅读 · 0 评论 -
插件化技术
转载于插件化技术 发表于 2020-03-29 | 分类于 Java插件化技术本文将介绍代码设计中的插件化实现。涉及到的关键技术点 自定义ClassLoader 和 ServiceLoader 。接着,会说下插件化技术的典型应用场景。ClassLoader类加载的过程参考:JVM 中关于3.2 类的生命周期 介绍。显式与隐式加载显式:在代码中通过调用 ClassLoader 加载 class 对象,如直接使用 Class.forName(name) 或 this.getClass().get转载 2021-11-15 23:37:01 · 571 阅读 · 0 评论 -
双亲委派与线程上下文类加载器
类加载器Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载。java中的类大致分为三种: 1.系统类 2.扩展类 3.由程序员自定义的类java类加载器又分:1)Bootstrap ClassLoader负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类2)Extension ClassLoader负责加载java平台中扩展功能的转载 2021-11-14 23:28:50 · 205 阅读 · 0 评论 -
SPI与JDBC
深入理解SPI机制一、什么是SPISPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。这一机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。我们先通过一个很简单的例子来看下它是怎么用的。1、小例子首先,我们需要定义一个接口,SPIServicepackage com.viewscenes.netsupervisor.s转载 2021-11-14 23:02:16 · 404 阅读 · 0 评论 -
JDBC与SPI机制
ServiceLoader方式服务发现进行分析。它是Jdk为我们提供的根据接口动态加载实现类(SPI机制)的工具。一、问题引出:当我们在使用原生jdbc时通常写为以下格式:我们在加载驱动类的时候的静态代码块会帮助我们进行注册,所以我们再DriverManager中能够取得连接。但事实上,我们去掉第一行Class.forName后,我们依旧可以获得相应数据库的连接,那么数据库驱动类是什么时候加载的呢?虚拟机怎么会知道驱动类的路径呢?二、准备知识1、ServiceLoader类的使用。再次我们只转载 2021-11-14 22:23:49 · 554 阅读 · 0 评论 -
Java SPI机制分析
转载于Java SPI机制分析序列化实战1.准备接口类public interface Serialization { /** * 序列化 * * @param obj * @return */ public byte[] serialize(Object obj) throws Exception; /** * 反序列化 * * @param param * @param c转载 2021-11-14 20:23:29 · 81 阅读 · 0 评论 -
JDBC SPI 类加载机制
转载于JDBC SPI 类加载机制一句话总结:1 自动加载:DriverManager的静态代码块执行的时刻,使用该时刻当前线程类加载器加载java.sql.Driver文件,并用当前线程类加载器加载及、实例化、registerDriver2 没有自动加载的,手动forName,传入一个类加载器及是否初始化;或loadClass➕实例化(load/find class 与 forname 在static代码块加载的不同 (二)非系统类jdbc)3 getConncetion时,校验调用getConn转载 2021-11-14 18:25:03 · 226 阅读 · 0 评论 -
ClassLoader
The Java platform uses a delegation model for loading classes. The basic idea is that every class loader has a “parent” class loader. When loading a class, a class loader first “delegates” the search for the class to its parent class loader before attempt.转载 2021-11-14 12:05:06 · 87 阅读 · 0 评论 -
ClassLoader踩坑实践——尝试失败【TODO】
原文是:ClassLoader踩坑实践ClassLoader踩坑实践摘要最近在项目中需要实现ClassLoader动态加载类的功能,虽然以前在资料上没少见过ClassLoader的加载原理,但在开发和优化这个功能的过程中还是遇到了不少问题,也踩了不少坑。现在将这些问题和踩坑经验介绍一下,希望能帮到其他同学少踩一些坑。如果有描述不准确的地方,欢迎指正。背景将问题背景简化一下,应用程序App中要访问Database(非真正的数据库,只是作为抽象与实现的典型例子),Database抽象类由clabc-c转载 2021-11-13 22:51:45 · 737 阅读 · 0 评论 -
classLoader与读取配置文件
关于Thread.getContextClassLoader的使用场景问题Thread context class loader存在的目的主要是为了解决parent delegation机制下无法干净的解决的问题。假如有下述委派链:ClassLoader A -> System class loader -> Extension class loader -> Bootstrap class loader那么委派链左边的ClassLoader就可以很自然的使用右边的ClassLoad转载 2021-11-13 22:16:43 · 771 阅读 · 0 评论 -
java自定义ClassLoader加载指定的class文件
转载于:java自定义ClassLoader加载指定的class文件继承ClassLoader并且重写findClass方法就可以自定义一个类加载器,具体什么是类加载器以及类加载器的加载过程与顺序下次再说,下面给出一个小demo首先定义一个类,比如MyTest,并且将其编译成class文件,然后放到一个指定的文件夹下面,其中文件夹的最后几层就是它的包名,这里我将这个编译好的类放到 : /Users/allen/Desktop/cn/lijie/MyTest.classpackage cn.lijie转载 2021-11-13 20:55:47 · 500 阅读 · 0 评论 -
Java8使用Stream的缺点是调试困难?
写在前面Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理集合数据。Stream API可以极大提高Java程序员的生产力,让我们写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。+-----------------转载 2021-11-06 22:59:30 · 735 阅读 · 0 评论 -
Java Method References
Java provides a new feature called method reference in Java 8. Method reference is used to refer method of functional interface. It is compact and easy form of lambda expression. Each time when you are using lambda expression to just referring a method, yo转载 2021-11-06 22:46:22 · 162 阅读 · 0 评论 -
openJDK源码下载及阅读
完全来源于:https://www.jianshu.com/p/6fe47f6a1b2a1、打开openjdk网站 打开链接:http://hg.openjdk.java.net/2、点击想要下载的jdk的版本,如jdk8u3、在新页面中找到jdk8u然后点击下面的jdk连接转载 2021-11-06 16:18:35 · 3071 阅读 · 1 评论 -
Java 里 NonNull 和 NotNull 区别
日常码 Java 的时候经常会遇到几个常用的 annotations,经常要用到 @NonNull,@NotNull 以及 @Nonnull。每次用都要查,每次查完又会忘掉,这里特意来总结一下以后用来自查。英文比较全的解释可以参考 stackoverflow 。lombok.NonNull这个 annotation 是 lombok 提供的,根据官方的解释可以看出它是用来辅助生成代码的。如果使用在 parameter 前,lombok 将生成一段代码来检测 parameter 是否为 null,如果是则转载 2021-11-06 15:55:42 · 8354 阅读 · 0 评论 -
Method Parameter Reflection
文章来源于:javatpointpackage java8_demo;public class Calculate { int add(int a, int b){ return (a+b); } int mul(int a, int b){ return (b*a); }}package java8_demo;import java.lang.reflect.Method;import java.lang.reflect.P转载 2021-11-06 11:46:35 · 349 阅读 · 0 评论 -
java8的新特性尝试
Java Repeating AnnotationsIn Java 8 release, Java allows you to repeating annotations in your source code. It is helpful when you want to reuse annotation for the same class. You can repeat an annotation anywhere that you would use a standard annotation.原创 2021-11-04 23:56:17 · 255 阅读 · 1 评论 -
java8 java9 java10 java11 java12新特性
来源于知乎java8lambda表达式(Lambda Expressions)。Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。方法引用(Method references)。方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,可以使语言的构造更紧凑简洁,减少冗余代码。默认方法(Default methods)。默认方法允许将新功能添加到库的接口中,并确保兼容实现老版本接口的旧有代码。重复注解(Repeating A转载 2021-11-04 23:28:48 · 423 阅读 · 0 评论 -
为什么高版本的jdk单例不再需要volatile修饰?
为什么高版本的jdk单例不再需要volatile修饰?new操作 和 初始化操作 设计为原子操作,自然就不存在 指令重排了!原创 2021-10-24 21:57:48 · 434 阅读 · 1 评论 -
双重检查锁单例模式为什么要用volatile关键字?
转载于 https://www.cnblogs.com/zhuifeng523/p/11360012.html前言从Java内存模型出发,结合并发编程中的原子性、可见性、有序性三个角度分析volatile所起的作用,并从汇编角度大致说了volatile的原理,说明了该关键字的应用场景;在这补充一点,分析下volatile是怎么在单例模式中避免双检锁出现的问题的。并发编程的3个条件1、原子性:要实现原子性方式较多,可用synchronized、lock加锁,AtomicInteger等,但volati转载 2021-10-24 21:54:12 · 82 阅读 · 0 评论