1、自动打包与解包
public class IntegerTest
{
public static void main(String[] arg){
Integer a=300000;
Integer b=300000;
Integer c=30;
Integer d=30;
System.out.println(a.equals(b));
System.out.println(a==b); //false
System.out.println(a==300000);
System.out.println(d.equals(c));
System.out.println(d==c);
System.out.println(d==30);
}
}
将这段代码反编译一下:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: IntegerTest.java
import java.io.PrintStream;
public class IntegerTest
{
public IntegerTest()
{
}
public static void main(String args[])
{
Integer integer = Integer.valueOf(0x493e0);
Integer integer1 = Integer.valueOf(0x493e0);
Integer integer2 = Integer.valueOf(30);
Integer integer3 = Integer.valueOf(30);
System.out.println(integer.equals(integer1));
System.out.println(integer == integer1);
System.out.println(integer.intValue() == 0x493e0);
System.out.println(integer3.equals(integer2));
System.out.println(integer3 == integer2);
System.out.println(integer3.intValue() == 30);
}
}
发现,其实自动打包就是使用valueOf方法来的,再看看java.lang.Integer中关于valueOf的源代码是怎样的:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
这下全明白了。
2、其实自动拆包使用的是intValue等类似的方法!
Integer类中使用一个private final int value来保存Integer对象中的int值,所以可以使用反射修改Integer中包含的int值!!!
3、Integer.TYPE与反射
public class ReflectTest {
public static void main(String[] args) {
System.out.println(void.class);//打印出void
System.out.println(Void.TYPE==void.class);//true
System.out.println(Integer.TYPE==Integer.class);//false
System.out.println(Integer.TYPE==int.class);//true
}
}
|