Strange char
When I view the source of a project, I notice it use log4j. So, I click into the
logger.error
method, and intellij decompile the class file and show the following code:
public void error(Object message, Throwable t) {
if(!this.repository.isDisabled('鱀')) {
if(Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel())) {
this.forcedLog(FQCN, Level.ERROR, message, t);
}
}
}
I was attracted by that strange character, because this character is so rare, so who would use such char in the code? There must be some reason.
Real source
It is strange, right? I am curious about that strange character so I find the source as following:
void error(Object message, Throwable t) {
if(repository.isDisabled(Level.ERROR_INT))
return;
if(Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel()))
forcedLog(FQCN, Level.ERROR, message, t);
}
public final static int ERROR_INT = 40000;
Now, we understand it. When intellij decompile the class, it convert the int 40000 to a char(which has a range of 0-65535).
Verify
But it may be the java compiler who see it is a int can represented by a char and change it. So I decompile the class file use
javap
to see whether it is represented by a char or int.
javap -c Category.class
public void error(java.lang.Object, java.lang.Throwable)
Code:
0: aload_0
1: getfield #13 // Field repository:Lorg/apache/log4j/spi/LoggerRepository;
4: ldc #31 // int 40000
6: invokeinterface #25, 2 // InterfaceMethod org/apache/log4j/spi/LoggerRepository.isDisabled:(I)Z
11: ifeq 15
// ldc means: push a constant #index from a constant pool (String, int or float) onto the stack
From the line 4, we can see it indeed a int, so it is some kind of bug.
char to int
Actually, when I write a large unicode char in source code, java compiler will automatically change it to a int
final char c2 = '鱀';
System.out.println(c2);
System.out.println('c');
125: ldc #19
127: istore 5
129: getstatic #5
132: ldc #19
134: invokevirtual #20
137: getstatic #5
140: bipush 99
142: invokevirtual #20
A simple code snippet can be get from
here
Ref
Written with StackEdit.
评论
发表评论