1.使用类字面常量:使用类字面常量不仅简单,还安全,因为它在编译时就会受到检查,不需要置于try语句块中,它根除了对forName方法的引用。类字面常量使用Class.forName时会自动的初始化。可以应用于普通的类,也可以应用于接口、数组以及基本数据类型。
class A { static final int a = 12; static { System.out.println("A"); } } class A2 { static int a2 = 123; static { System.out.println("A2"); } } class A3 { static int a3 = 23; static { System.out.println("A3"); } } public class Test9 { public static void main(String[] args) { Class c = A.class; System.out.println("创建A之后"); System.out.println(A.a); System.out.println(A2.a2); try { Class c1 = Class.forName("SixtySix.A3"); } catch (ClassNotFoundException e) { System.out.println("找不到A3"); System.exit(1); } System.out.println("创建A3之后"); System.out.println(A3.a3); } }
2.instanceof与Class的等价性:instanceOf和isInstance()的结果一样,比较的时候都考虑了继承关系。equals()和==比较是否为同一个类,没有考虑继承关系。
class Letter { } class A1 extends Letter { } public class Test10 { public static void test(Object o) { System.out.println(o.getClass()); System.out.println((o instanceof Letter)); System.out.println(o instanceof A1); System.out.println(Letter.class.isInstance(o)); System.out.println(A1.class.isInstance(o)); System.out.println(o.getClass() == Letter.class); System.out.println(o.getClass() == A1.class); System.out.println(o.getClass().equals(Letter.class)); System.out.println(o.getClass().equals(A1.class)); } public static void main(String[] args) { test(new Letter()); test(new A1()); } }
3.反射:运行时的类信息:在编译时,编译器必须知道所要通过RTTI来处理的类。反射的功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。 在用反射做事情之前必须先加载那个类的Class对象。
class Person { private String name = "Tom"; public int age = 18; public Person() { } private void say() { System.out.println("say()"); } public void work() { System.out.println("work()"); } } public class Test11 { public static void main(String[] args) { Class c = Person.class; String className = c.getName(); System.out.println(className); Field[] f = c.getDeclaredFields(); for (Field field : f) { System.out.println(field.getName()); } Method[] m = c.getDeclaredMethods(); for (Method method : m) { System.out.println(method.getName()); } } }