Thinking in java4 14章 RTT和反射学习笔记
java 菜鸟教程
http://www.runoob.com/java/java-number.html
一 Class.getName 和Class.getCanonicalName() 区别
数组,内部类
[Ljava.lang.String;
java.lang.String[]
typeinfo.toys.ToyTest$Test
typeinfo.toys.ToyTest.Test
一 惰性机制
.class 不加载类,访问static final 编译器常量的静态域也不会加载,单访问static final 非编译器常量会加载类。见ClassInitialization类
class.forName(); 会加载类
//: typeinfo/ClassInitialization.java
import java.util.*;
class Initable {
static final int staticFinal = 47;
static final int staticFinal2 =
ClassInitialization.rand.nextInt(1000);
static {
System.out.println("Initializing Initable");
}
}
class Initable2 {
static int staticNonFinal = 147;
static {
System.out.println("Initializing Initable2");
}
}
class Initable3 {
static int staticNonFinal = 74;
static {
System.out.println("Initializing Initable3");
}
}
public class ClassInitialization {
public static Random rand = new Random(47);
public static void main(String[] args) throws Exception {
Class initable = Initable.class;
System.out.println("After creating Initable ref");
// Does not trigger initialization:
System.out.println(Initable.staticFinal);
// Does trigger initialization:
System.out.println(Initable.staticFinal2);
// Does trigger initialization:
System.out.println(Initable2.staticNonFinal);
Class initable3 = Class.forName("Initable3");
System.out.println("After creating Initable3 ref");
System.out.println(Initable3.staticNonFinal);
}
} /* Output:
After creating Initable ref
47
Initializing Initable
258
Initializing Initable2
147
Initializing Initable3
After creating Initable3 ref
74
*///:~
一 int.class Integer.Type Integer.class
见GenericClassReferences 和 WildcardClassReferences类
一 Class<\? super FancyToy> 和cast用法
Class<\? super FancyToy> up = ftClass.getSuperclass();
Class houseType = House.class;
House h = houseType.cast(b);
一 instanceof, isAssignableFrom, isInstance的用法
Class<\?> superClass = type.getSuperclass();
if (superClass != null && baseType.isAssignableFrom(superClass))
Base.class.isInstance(x)
一 反射破坏权限控制符。RTTI改变性能。