WHH

MY BLOG

Java代码中可以通过Unicode注释后隐藏部分实际代码

1
2
3
4
@Test
public void demo(){
// \u000d System.out.println("Hello");
}

上述代码会输出Hello,因为前面unicode会转义为换行,后面的代码正常执行。后面代码也可以全部转义为unicode,用于隐藏,如下。

1
2
3
4
5
@Test
public void demo(){
// \u000d \u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0022\u0048\u0065\u006c\u006c\u006f\u0022\u0029\u003b
\u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0022\u0048\u0065\u006c\u006c\u006f\u0022\u0029\u003b
}

上述会输出2次Hello

之前看slf4j-api源码时,2.0版本中切换不同的日志,采用的就是SPI。通过定义接口,不同的日志框架实现该接口,对于使用方而言,通过JDK提供的方法找到实现的类并构建对象。接口不直接实现,又其他第三方实现该接口,支持热插拔。

slf4j-api 1.*版本并不是用的这种方法,是通过自定义类org.slf4j.impl.StaticLoggerBinder,实现使用不同的日志。

阅读全文 »

在Java中Queue类主要存在两个子接口、一个抽象子类AbstractQueue。
AbstractQueue继承AbstractCollection和实现接口Queue,不允许存在null节点,存入和删除节点是如果为null会直接报错。

阅读全文 »

定义

一般情况下,队列为一种先进先出的线性表。队列只允许在尾端插入数据,前端删除数据。也存在双端队列,可以在头部和尾部进行插入删除数据。

阅读全文 »

使用IDEA开发SpringBoot项目,有时候在导入项目后,写配置文件无提示。
可以正常提示的application.properties为一个绿叶图标,不能正常提示的图标为普通properties图标。

阅读全文 »

Servelt 3.0在2009年已经随着JavaEE 6推出。主要增加了异步处理、注解支持、模块化处理

异步支持

在之前Servelt在接收到请求后需要处理完毕后再做返回,线程一直在阻塞状态,现在可以接收数据后交由其他线程处理,线程接收线程本身返回容器。如果聊天中等待消息。
WebServlet设置asyncSupported为true即可(默认为false)

阅读全文 »

BeanFactoryPostProcessor

实现改接口,可以在Bean创建前,修改Bean定义的对象(元数据),也就是定义Bean的相关信息。但是需要注意的是,不可以在该实现里面触发Bean的实例化操作。可能会导致其他意想不到的问题。文档中有注释,如果需要与构建的Bean有交互的话使用BeanPostProcessor

BeanPostProcessor

该接口有两个方法。一个为执行Bean的init方法之前,一个是之后,在该过程中可以对该Bean进行修改操作。

阅读全文 »

BeanFactory

是Spring IOC容器定义的跟接口,用于获取Bean。

FactoryBean

是一个Bean,只不过是一个工厂Bean,在BeanFactory需要获取Bean的时候,通过FactoryBean来生成对象返回,如果是单例,缓存生成的对象。如果需要获取的是FactoryBean而不是FactoryBean生成Bean时,需要在Bean的名称上面加一个**&**

阅读全文 »

前言:本来项目中使用的redis采用的是集群模式,之后改为了哨兵模式。
今天在缓存平台上查看缓存,发现命中率非常低,缓存中key非常少,之前集群模式应该有即使上百万的key,现在就几百。几番排查后发现在集群模式下使用了mset可以正常批量写入数据,之后通过mexpire批量设置失效时间。改为哨兵模式后,mset无法使用。
业务中如果缓存没命中会直接查询数据库,所有在测试时并未发现什么问题。

确实哨兵模式下,也有对应的mset,但是该模式下没有批量设置失效时间,只能使用lua脚本对数据进行操作。

阅读全文 »

String中replace是我们常用的一个方法,用于替换字符中的字母。

方法java.lang.String#replace(char, char)

入参为char,源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public String replace(char oldChar, char newChar) {
//判断传入的oldChar和newChar是否一致,如果不一样开始做替换
if (oldChar != newChar) {
int len = value.length;
int i = -1;
char[] val = value; /* 避免使用 getfield 操作码 */
//获取第一个匹配需要替换的字符
while (++i < len) {
if (val[i] == oldChar) {
break;
}
}
//判断是否匹配上,如果匹配上开始做替换,如果未匹配上,直接返回this
if (i < len) {
//构造一个新字符数组,长度数据和原有一致
char buf[] = new char[len];
//把第一个匹配上的前面数据赋值到新数组中
for (int j = 0; j < i; j++) {
buf[j] = val[j];
}
//遍历数组后续,如果匹配上替换为新字符
while (i < len) {
char c = val[i];
buf[i] = (c == oldChar) ? newChar : c;
i++;
}
//通过字符数组构建一个新字符串
return new String(buf, true);
}
}
//如果传入参数一样,直接返回当前字符串对象
return this;
}
阅读全文 »
0%