作为一个后端同学,经常被安全的小伙伴盯上,找一找安全漏洞;除了常说的注入之外,还有比较吓人的执行远程命令,唤醒本地应用程序等;然后有意思的问题就来了,写了这么多年的代码,好像还真没有尝试过用java来唤醒本地应用程序的
比如说一个最简单的,打开本地的计算器,应该怎么搞?
接下来本文将介绍一下如何使用java打开本地应用,以及打开mac系统中特殊一点的处理方式(直白来说就是不同操作系统,使用姿势不一样)
作为一个后端同学,经常被安全的小伙伴盯上,找一找安全漏洞;除了常说的注入之外,还有比较吓人的执行远程命令,唤醒本地应用程序等;然后有意思的问题就来了,写了这么多年的代码,好像还真没有尝试过用java来唤醒本地应用程序的
比如说一个最简单的,打开本地的计算器,应该怎么搞?
接下来本文将介绍一下如何使用java打开本地应用,以及打开mac系统中特殊一点的处理方式(直白来说就是不同操作系统,使用姿势不一样)
最近遇到一个奇怪的问题,一个jar包无法解压,直接使用jar xvf xxx.jar
没有任何响应
因为实际想看的只是jar包中的某个class文件,基于此可以通过 jar tf
查看文件列表,在通过 jar xf xxx.jar xxxfile
的方式来解压指定文件来实现目的
接下来记录一下jar包的几个操作case
记录一个在实际使用过程中遇到的问题,在解析一个url格式的字符串中的域名时,直接使用下面这种姿势
1 | public static ImmutablePair</**host*/String, /**uri*/String> foramtUri(String uri) { |
正常使用上面这种进行解析,没啥问题,结果某天突然抛了个异常
通过前面几篇图片转字符、灰度图的文章介绍之后,接下来我们再来看一个有意思的东西,基于前文的基础,实现位图转矢量图的功能
关于位图与矢量图的简单理解如下:
上一篇文章介绍了静态图转字符的实现demo;接下来也该是动态图转字符的demo了
从前面几篇文章的学习过程中,要想实现这个功能就属于信手拈来了
前面几篇博文介绍了使用jdk来对图片做一些有意思的转换,接下来我们再介绍一个有意思的玩法,直接根据图片,输出一个二维字符数组,实现用字符来实现绘画的场景
本文通过一个简单的实例,演示如何使用java来实现图片灰度化处理,主要借助下面两种策略来处理颜色
灰度化公式
1 | avgColor = red * 0.299f + green * 0.587f + blue * 0.114f |
均值方式
1 | avgColor = (red + green + blue) / 3.0f |
通常我们最多的场景是从本地资源中读取文件,这个时候我们经常需要注意的是相对路径、绝对路径问题;
除了从本地获取文件之外,从网络中获取文件资源(如图片)也属于相对常见的场景,接下来我们封装一个工具类,可以支持以上各种类型的数据读取
偶然发现一个问题,在使用String.format进行格式化输出时,发现参数个数不匹配时,会抛出异常,如
1 | String msg = String.format("hello %s, %s", "a"); |
上面这个执行之后,会抛MissingFormatArgumentException
异常,提示信息如
1 | java.util.MissingFormatArgumentException: Format specifier '%s' |
在日常开发中,分页遍历迭代的场景可以说非常普遍了,比如扫表,每次捞100条数据,然后遍历这100条数据,依次执行某个业务逻辑;这100条执行完毕之后,再加载下一百条数据,直到扫描完毕
那么要实现上面这种分页迭代遍历的场景,我们可以怎么做呢
本文将介绍两种使用姿势
当一个对象没有重写hascode
方法时,它返回的内存地址,当覆盖之后,我们有什么办法获取对象的内存地址么?
System.identityHashCode()
输出内存地址字符串分割,属于比较常见的case了,在实际开发中,相信很多小伙伴会借助common-lang
工具包中的StringUtils
来实现,使用姿势也很简单
1 | String[] ans = StringUtils.split("a,b,c", ","); |
一般来讲上面这种使用方式没有问题,但是当分隔符前后为空时,需要特别注意,可能会和你预期的返回不一致
实际业务开发中偶尔会遇到判断一个对象是否为基本数据类型,除了我们自老老实实的自己写之外,也可以借助Spring的 BeanUtils 工具类来实现
1 | // Java基本数据类型及包装类型判断 |
借助LinkedHashMap飞速实现一个LRU算法的缓存
1 | import java.util.LinkedHashMap; |
在我们的实际开发中,多多少少会遇到统计一段代码片段的耗时的情况,我们一般的写法如下
1 | long start = System.currentTimeMillis(); |
上面的写法没有什么毛病,但是看起来就不太美观了,那么有没有什么更优雅的写法呢?
HashMap对于javer而言,可以说是非常非常熟悉的一个容器类了,可以说99.99%的java开发者都用过它,那么你知道怎样创建一个HashMap是最优雅的方式呢?
从db中查了一个BigDecimal数据,希望按照四舍五入的方式进行取整,发现直接使用 intValue
不太对,特此记录一下正确姿势
1 | new BigDecimal(4.51).setScale(0, RoundingMode.HALF_EVEN).intValue() |
map的迭代删除,和我们常见的list,set不太一样,不能直接获取Iteraotr对象,提供的删除方法也是单个的,根据key进行删除,如果我们有个需求,将map中满足某些条件的元素删除掉,要怎么做呢?
我们有这么一个场景,给你一个列表,可以动态的新增,但是最终要求列表升序,要求长度小于20,可以怎么做?
这个还不简单,几行代码就可以了
1 | public List<Integer> trimList(List<Integer> list, int add) { |
之前偶然在一个开源项目中看到下面这种写法,深感惊奇,当时没有记录,后来果不其然就忘掉了这种写法,现在又看到这种写法,特此记录
1 | long price = 1_000_123L; |
如何获取应用中,所有活动的线程?
1 | ThreadGroup group = Thread.currentThread().getThreadGroup(); |
上面是获取当前线程所在的ThreadGroup, 然后将这个分组内的所有线程丢到slackList数组中,实际测试时,数组大小可能是大于实际的线程数的(而且可能性特别大)
通过ThreadGroup,还可以获取上一层的Group, 然后遍历所有的线程
Update your browser to view this website correctly. Update my browser now