java语言,类是程序的一部分,每一个类都有一个Class对象。换句话说,每当编写并且编译了一个新类,就会产生一个Class对象。所有的类都是在对其第一次使用时,动态加载到JVM中的。当程序创建第一个对类的静态成员的引用时,就会加载这个类。这个证明构造器也是类的静态方法,即使在构造器之前并没有使用static关键字。因此使用new操作符创建类的新对象也会被当作类的静态成员的引用。java程序在它开始运行之前并非被完全加载,其各个部分是在需要时才加载。
1 package typeinfo; 2 class Candy{ 3 static{ 4 System.out.println("Loading Candy....."); 5 } 6 } 7 8 class Gum{ 9 static{ 10 System.out.println("Loading Gum........"); 11 } 12 } 13 14 class Cookie{ 15 static{ 16 System.out.println("Loading Cookie......"); 17 } 18 } 19 20 public class SweetShop { 21 public static void main(String[] args) { 22 System.out.println("inside main"); 23 new Candy(); 24 System.out.println("after create candy"); 25 try { 26 Class.forName("Gum");//取得Class对象引用的一个方法 27 } catch (ClassNotFoundException e) { 28 System.out.println("cound not found Gum"); 29 } 30 System.out.println("after class.forName(\"Gum\")"); 31 new Cookie(); 32 System.out.println("after create cookie"); 33 } 34 }
//output~:
1 inside main 2 Loading Candy..... 3 after create candy 4 cound not found Gum 5 after class.forName("Gum") 6 Loading Cookie...... 7 after create cookie
无论何时,只要您想在运行时使用类型信息,就必须首先获得对恰当的Class对象的引用。Class.forName()就是实现此功能的一种方法。如果你已经拥有了一个类型的对象,那就可以通过调用getClass()方法来获取Class引用了。
举例class中一些有用的方法
1 package typeinfo; 2 interface HashBatteries{} 3 interface Waterproof{} 4 interface Shoots{} 5 6 class Toy{ 7 Toy() {} 8 Toy(int i){} 9 } 10 11 class FancyToy extends Toy implements HashBatteries,Waterproof,Shoots{ 12 FancyToy(){ 13 super(1); 14 } 15 } 16 17 public class ToyTest { 18 static void printInfo(Class zz){ 19 System.out.println("类的名称:" + zz.getName() + 20 "是否是接口?" + zz.isInterface()); 21 System.out.println("类的简称:" + zz.getSimpleName()); 22 } 23 24 public static void main(String[] args) { 25 Class c = null; 26 try { 27 c = Class.forName("typeinfo.FancyToy"); 28 } catch (ClassNotFoundException e) { 29 System.out.println("can't find FancyToy"); 30 System.exit(1); 31 } 32 printInfo(c); 33 for(Class face : c.getInterfaces()){//Class.getInterfaces()返回的是Class对象 34 printInfo(face); 35 } 36 Class up = c.getSuperclass();//获取直接基类 37 Object object = null; 38 try { 39 object = up.newInstance();//实现虚拟构造器,来创建实例,从而获得引用 40 } catch (InstantiationException e) { 41 System.exit(1); 42 } catch (IllegalAccessException e) { 43 System.exit(1); 44 } 45 printInfo(object.getClass()); 46 } 47 }
///output~:
1 类的名称:typeinfo.FancyToy是否是接口?false 2 类的简称:FancyToy 3 类的名称:typeinfo.HashBatteries是否是接口?true 4 类的简称:HashBatteries 5 类的名称:typeinfo.Waterproof是否是接口?true 6 类的简称:Waterproof 7 类的名称:typeinfo.Shoots是否是接口?true 8 类的简称:Shoots 9 类的名称:typeinfo.Toy是否是接口?false 10 类的简称:Toy