昨天通过几个小程序以及Hangout源码学习了CLI的基本使用,今天就来尝试翻译一下CLI的官方使用手册。 下面将会通过几个部分简单的介绍CLI在应用中的使用场景。...昨天已经联系过几个基本的命令行参数使用场景,可以参考这里 通过使用Apache Commons CLI可以帮助开发者快速构建命令行启动模式,并可以快速生成帮助指令,基于用户启动参数提供不同的服务。...第二个参数是Bool型,代表该选项是否需要额外的参数。 第三个参数是该选项的描述信息。 上面的例子就代表,t选项不需要参数,它的意思是显示当前时间。...org.apache.commons.cli.MissingArgumentException: Missing argument for option: c at org.apache.commons.cli.DefaultParser.checkRequiredArgs...at org.apache.commons.cli.DefaultParser.parse(DefaultParser.java:76) at org.apache.commons.cli.DefaultParser.parse
CLI 命令代码实现 命令行程序处理流程相对比较简单,主要流程为设定命令行参数 -> 解析输入参数 -> 使用输入的数据进行逻辑处理 CLI 定义阶段 每一条命令行都必须定义一组参数,它们被用来定义应用程序的接口...Apache Commons CLI 使用 Options 这个类来定义和设置参数,它是所有 Option 实例的容器。...,第一个参数设定这个 option 的单字符名字,第二个参数指明这个 option 是否需要输入数值,第三个参数是对这个 option 的简要描述。...这个阶段在用户的代码中实现,CommandLine 中的访问方法为用户代码提供了 CLI 的询问能力。...CLI 询问阶段的目标结果就是将所有通过命令行以及处理参数过程中得到的文本信息传递给用户的代码。
Apache Commons Collections是Java中应用广泛的一个库,包括Weblogic、JBoss、WebSphere、Jenkins等知名大型Java应用都使用了这个库。...); } TransformedMap.checkSetValue(): protected final Transformer valueTransformer; //= decorate函数的第三个参数...类型,可以直接在执行构造函数时定义 private final Map memberValues; 衔接上文可知 : 我们应该将memberValues定义为一个可利用的...= new ChainedTransformer(transformers); chainedTransformer.transform(Runtime.class); 递归调用原理(令hashMap第三个参数的...[]数组为以上的transforms数组,所以会逐步执行: object = new InvokerTransformer("getMethod",new Class[]{String.class,Class
一、简介 DbUtils是Apache下commons工具集中的一个小工具,它主要是对JDBC封装的ORM小工具,简化了JDBC的操作。...三、下载与安装 下载: http://commons.apache.org/proper/commons-dbutils/download_dbutils.cgi 安装: 教程中使用的是1.6的版本,下载的压缩包是...QueryRunner有两种方式来管理连接,一种是在构建QueryRunner实例时通过构造方法传递一个数据源DataSource实例;另一种则是在调用相应的操作方法,如query、update、batch...Connection对象和要执行的sql语句 // 第三个参数开始是一个可变参数,分别是sql语句中所需的参数,对应上面语句中问号的顺序 // 执行完成后会返回影响的行数...; QueryRunner qr = new QueryRunner(DBCPUtil.getDataSource()); //使用batch方法,第三个参数是一个二维数组
类可以在一个元素被加入到集合内时自动对该元素进行特定的修饰变换,在decorate()方法中,第一个参数为修饰的Map类,第二个参数和第三个参数作为一个实现Transformer接口的类,用来转换修饰的...Map的键、值(为null时不进行转换);因此,当被修饰的map添加新元素的时候便会触发这两个类的transform方法。...,valueTransformer是处理新元素 value 的回调,当我们向outerMap中添加新元素时,它就会调用keyTransformer或valueTransformer里面的transform...初始化时传入三个参数,第一个是要执行的方法名,第二个是方法需要传入的参数类型,第三个是方法需要传入的参数值。...在前面放Transformer[]假数组的原因是:使用了Proxy代理了被修饰的Map对象时,我们在任何地方执行Map的方法时,都会触发Proxy#invoke,从而执行命令弹出计算器。
完成访问城市列表的操作:Country.ES.cities。访问与Valencia相对应的List元素(第三个元素)已完成:Country.ES.cities.get(2)。...为了使用“ randomNumeric”方法,您需要首先从Apache Commons库中导入相应的类,如下所示: import static org.apache.commons.lang3.RandomStringUtils.randomNumeric...对于Maven项目,您只需要在“ pom.xml”文件中添加以下条目(确保您使用的是最新版本): org.apache.commons的下拉列表的工作方式如下:未打开(未单击它们)时,“国家/地区”下拉列表显示为空选择,而“城市”下拉列表则完全为空。此时的城市下拉列表已禁用,您无法从中选择任何选项。 ?...我们知道我们已经将期望值存储为Enum中的“ label ”参数,但是我们还需要处理下拉菜单中显示的空文本选项。
完成访问城市列表的操作:Country.ES.cities。访问与Valencia相对应的List元素(第三个元素)已完成:Country.ES.cities.get(2)。...为了使用“ randomNumeric”方法,您需要首先从Apache Commons库中导入相应的类,如下所示: import static org.apache.commons.lang3.RandomStringUtils.randomNumeric...对于Maven项目,您只需要在“ pom.xml”文件中添加以下条目(确保您使用的是最新版本): org.apache.commons的下拉列表的工作方式如下:未打开(未单击它们)时,“国家/地区”下拉列表显示为空选择,而“城市”下拉列表则完全为空。此时的城市下拉列表已禁用,您无法从中选择任何选项。...我们知道我们已经将期望值存储为Enum中的“ label ”参数,但是我们还需要处理下拉菜单中显示的空文本选项。
结合以上流程,我们就可以知道这个过程是: 从 实例 AnnotationInvocationHandler 时传入的注释类 中获取最后一个方法,然后把它编入为一个HashMap(以下称为注释方法Map)...所以上面为什么put(“value”,任意)才能达成攻击的原因是, Target Retention SuppressWarnings 这三个注释类都有且只有一个方法名为value的方法。...是将传入的transformer方法按顺序执行,并将上一个方法执行结果做参数传递给下一个方法。...构建一个Map的代理类,其第三个参数是刚刚得到的 AnnotationInvocationHandler 对象,再故技重施将其通过向上转型得到一个 AnnotationInvocationHandler...当该对象反序列化执行readObjct方法时,会执行以下entryset方法 本质上来说,是对一个代理类执行了一下entrySet方法,即执行了代理类的invoke方法,又因为代理类的第三个参数填入的是
为了简化这些任务,Apache Commons Lang库提供了一个实用工具类MapUtils。 配置方法 要使用MapUtils,首先需要导入Apache Commons Lang库。...你可以通过以下方式配置你的Java项目来使用MapUtils: 下载Apache Commons Lang库,并将其添加到你的项目中。...使用构建工具如Maven或Gradle,在项目的依赖中添加Apache Commons Lang库。...get结果为null返回null: 修饰符和返回类型 方法 描述 static Boolean getBoolean(MapApache Commons Collections库,MapUtils支持多值Map。多值Map允许一个键关联多个值,这在某些场景下非常有用,例如处理多选框选项或分组数据。
一、介绍一下 Apache Commons Cli,有一个感官的认识 我们在使用一些开源项目时,会敲一些命令,有简单的,比如 hadoop version;有复杂的,比如 flink run ......一般这些命令后面有很多的参数,特别是在往 Yarn 上提交 Flink 任务时,后面要设置很多属性。...而 Apache Commons Cli 这个库就是为了解决这个问题的。它封装了命令行的基本元素,帮助程序去解析传递给程序的命令行参数。也可以打印帮助信息来说明这个命令行的有效参数。...二、核心概念 核心概念只有三个,那就是命令行程序的处理流程 定义阶段 首先我们要通过 Options 对象,来创建实例,把我们可能要处理的所有参数,都预先定义好。...package com.hudsun.flink.commonscli; import org.apache.commons.cli.*; /** * @Author wangkai * @Time
main函数的第一个参数为argc,参数类型为int,第二个参数为argv,参数类型为char*类型的指针数组(也叫命令行参数表),该指针数组以NULL结尾。...当我们在命令行解释器输入一串指令时,命令行解释器会将这一串指令当成一个字符串,并以空格作为分隔符,将这个字符串分割成更小的字符串,并将这些更小的字符串分别存到argv数组中。...解释器还会计算选项的数量,并将其作为argc的值传递给main函数。命令行解释器会负责将这些信息正确地传递给程序的main函数,以便程序能够使用它们。...这也就可以解释为什么同一条指令我们在命令行中传递不同的选项它可以帮我们执行不同的功能。所以选项的本质就是命令行参数。命令行参数,是Linux指令选项的基础。...三、main函数的第三个参数 其实main函数最多可以传递三个参数,第三个参数叫env,参数类型同样为char*的指针数组,env数组中保存的正是该进程拥有的环境变量。
#include 初始化 GLFW 在 main 函数中,我们首先使用 glfwInit 初始化 GLFW,然后我们可以使用 glfwWindowHint 配置 GLFW,这个配置的选项和含义可以在...,前两个参数设置窗口左下角的位置,第三个和第四个参数以像素为单位设置渲染窗口的宽度和高度,如果视口尺寸设置为小于 GLFW 尺寸的值;然后,所有 OpenGL 渲染都将显示在一个较小的窗口中 glViewport...),并将其显示为输出到屏幕 双缓冲区 当应用程序在单个缓冲区中绘制时,生成的图像可能会显示闪烁问题。...这是因为生成的输出图像不是瞬间绘制的,而是逐像素绘制的,通常从左到右和从上到下绘制。 由于此图像在呈现时不会立即显示给用户,因此结果可能包含伪影。... glClearColor 指定要清除屏幕的颜色,每当我们调用 glClear 并清除颜色缓冲区时,整个颜色缓冲区都将填充 glClearColor 配置的颜色,其中颜色的选项是rgb和透明度四个通道参数
com.sun.org.apache.bcel.internal.util.ClassLoader是常常在构造漏洞利用POC时用到的类。...BCEL的全名应该是Apache Commons BCEL,属于Apache Commons项目下的一个子项目。...就这个库的功能来看,其使用面远不及同胞兄弟们,但是他比Commons Collections特殊的一点是,它被包含在了原生的JDK中,位于com.sun.org.apache.bcel。...,比较鸡肋;第二个利用链用到的是JNDI注入,利用条件相对较低,但是需要连接远程恶意服务器,在目标没外网的情况下无法直接利用;第三个利用链也是一个字节码的利用,但其无需目标额外开启选项,也不用连接外部服务器...有读过我的《Java安全漫谈》第一篇文章的同学应该对Class.forName还有印象,第二个参数initial为true时,类加载后将会直接执行static{}块中的代码。
,被修饰过的Map在添加新的元素时,将可以执⾏⼀个回调。...,这个正是执行恶意命令的核心类 实例化这个类时需要传⼊三个参数 第⼀个参数是待执⾏的⽅法名 第⼆个参数是这个函数的参数列表的参数类型 第三个参数是传给这个函数的参数列表 new InvokerTransformer...该类会对传入的Transformer数组进行链式调用,将前一个Transformer的执行结果当作参数传递到下一个,直至全部Transformer执行完毕后返回 // org.apache.commons.collections.functors.ChainedTransformer...构造POC 尝试使用AnnotationInvocationHandler对象生成序列化数据 import org.apache.commons.collections.Transformer; import...使用Runtime.class时的调用链为: Runtime.class.getMethod("getRuntime").invoke(null) Runtime.class可以使用ConstantTransformer
,然后要第二个减第一个,第三个减第二个,稍微粗心一点(尤其是 CV 大法)时,很容易搞错。...那也就是说,如果你的项目中没有使用 Spring 全家桶,只用了 hutool 工具包,那就可以使用 hutool 的 StopWatch 来代替 System.currentTimeMillis()。...nanoTime 比 currentTimeMillis 的粒度更细,前者是以纳秒为单位,后者是以毫秒为单位。 注意两者都是 native 方法,也就是说,值的粒度其实取决于底层的操作系统。...StopWatch 可以记录每个子任务的名称,以及按格式化打印结果,尤其是针对多任务统计时更友好一点。...当然了,除了选择 Spring 和 hutool 的 StopWatch,Apache commons-lang3 的 StopWatch 也是一个不错的可选项,更加灵活多变。
所以PropertyUtils.getProperty就是执行bean中的getName函数并将得到的结果返回....; } } 因为TemplatesImpl#getOutputProperties符合JavaBean的获取内容的函数格式, 所以当我们使用PropertyUtils#getProperty函数获取...CommonsBeanutilsShiro 如果直接构造CB链去打Shiro的话会失败并且在后台看到报错显示无法加载CC依赖中的一个类, 这是因为我们使用默认的单参数构造函数的话会在后面使用生成一个CC...(); } } 我们如果选择单参数构造函数就会使用CC依赖中的对象所以反序列化失败报错, 而不会执行我们的命令, 但是我们可以看到第三个构造函数, 这里我们是可以自己传入一个Comparator...解决方法: 我们选择第三个构造函数 public BeanComparator(String property, Comparator comparator) { this.setProperty
Jar包准备 安装 Java 开发工具包JDK 下载 Apache Commons Logging API 下载 Spring 框架库 HelloSpring 创建 Java 项目 添加必需的jar...Logging API 从 http://commons.apache.org/logging/ 下载 Apache Commons Logging API 的最新版本, 获取jar包 ---- 下载...选中项目单击右键,然后在快捷菜单上按照下面可用的选项:Build Path -> Configure Build Path 显示 Java 构建路径窗口 ?.../> bean> beans> 当 Spring 应用程序被加载到内存中时,框架利用了上面的配置文件来创建所有已经定义的 beans,并且按照 标签的定义为它们分配一个唯一的 ID。...你可以使用 标签来传递在创建对象时使用不同变量的值。 ---- 运行程序 运行 MainApp ?
命令行参数是与程序交互的重要方式,了解如何正确处理它们对于开发实用的命令行工具和脚本至关重要。 引言 命令行参数是软件开发中经常使用的一种机制,它允许我们在运行程序时向程序传递参数和选项。...让我们深入了解函数参数的基本概念以及它们在Java中的角色。 函数参数是什么? 函数参数是函数定义的一部分,用于接收输入数据。它们允许在调用函数时将数据传递给函数,从而使函数能够执行特定的操作。...形式参数是函数内部使用的变量,用于处理传递给函数的实际参数。 实际参数(Actual Arguments): 实际参数是在调用函数时提供给函数的值。它们是函数调用的一部分,用于向函数传递数据。...通常,您可以使用命令行解析库(如Apache Commons CLI或自定义解析逻辑)来帮助解析参数。...import org.apache.commons.cli.*; public class CommandLineExample { public static void main(String
如果有很多个选项卡,只想保留某一个,可以一个个删除肯定太麻烦 使用如你所想,使用遍历的方法(这里计算选项卡个数使用集合的count方法) 上来就是 ?...我们永远都只删除当时的第一个值,因为索引从0开始,所以上面表示删除第一个选项卡以外的所有选项卡。 但如果只保留第三个选项卡怎么办 ?...加了一个判断,运行第三遍的时候不删除,但是结果还是不对,只保留了最后一个 还是那个原因,我们只是让第三遍循环不删除而已,但是第四遍就把第三个选项卡删除了,以此类推,只剩下最后一个了 所以要在第三遍之前,...大功告成,最后可以封装成一个方法,当满足什么条件时,选择保留指定的选项卡,比如登录的是aa同学,aa同学选项卡是第十个,我们就传个十进去,然后把十减一代替二,实现只保留第十个选项卡 在窗体中直接引用tabPage....Parent = null;隐藏 this.tabPage1.Parent = this.tabControl1;显示
领取专属 10元无门槛券
手把手带您无忧上云