Class对象

[ API] java.lang.Class 1.0

  • static Class forName(String className)
    返回描述类名为className的Class对象。
  • String getName()
    返回类的全限定的类名(包含包名)。
  • String getSimpleName()
    返回不含包名的类名
  • String getCanonicalName()
    返回全限定的类名
实例Test.java:
class Dog{ static { System.out.println("我被加载了"); } } public class Test { public static void main(String[] args) { Class c = null; try { c = Class.forName("com.test.Dog"); System.out.println(c.getName()); System.out.println(c.getSimpleName()); System.out.println(c.getCanonicalName()); }catch (ClassNotFoundException e){ System.exit(1); } try{ Class.forName("com.test.Dog"); }catch (ClassNotFoundException e){ System.exit(1); } } }

输出:
我被加载了 com.test.Dog Dog com.test.Dog

forName()是取得Class对象的引用的一种方法。第二个try语句没有输出任何结果,说明,如果类Dog还没有被加载就会加载它,如果加载了就不会再次加载。
[API] java.lang.Object 1.0
  • Class getClass()
    返回表示该对象的实际类型的Class引用
实例Test.java:
class Dog{ static { System.out.println("我被加载了"); } } public class Test { public static void main(String[] args) { Dog dog= new Dog(); Class c1 = dog.getClass(); System.out.println(c1.getName()); System.out.println(c1.getSimpleName()); System.out.println(c1.getCanonicalName()); } }

上述代码表明,当我们知道了某个类型的具体对象后,那就可以通过调用getClass()方法来获取Class引用了。它是属于Object类的一部分。
[ API] java.lang.Class 1.0
  • Class[] getInterfaces()
    返回的是这个Class对象实现的接口的Class对象数组。
  • boolean isInterface()
    返回这个Class对象是否表示一个接口。返回的是基类,而不是接口。
  • Object newInstance()
    返回这个类的新实例。返回的是一个Object引用,但是这个引用指向这个类的类型对象。使用newInstance()来创建的类,必须带有默认的构造器。
  • Class getSuperClass()
    返回你可以用来进一步查询的Class对象。
实例Test.java:
interface Run { void run(); }interface Jump { void jump(); }class Person { private String name = "defaultName"; private int age = 0; Person() {}Person(String name, int age) { this.name = name; this.age = age; } public String getName(){ return name; } public int getAge(){ return age; } }class Sportsman extends Person implements Run, Jump { Sportsman(String name, int age) { super(name, age); }public void run() {}public void jump() {} }public class Test { public static void main(String[] args) { Sportsman sportsman = new Sportsman("noshower", 22); Class c1 = sportsman.getClass(); Class c2 = null; try { c2 = Class.forName("com.test.Jump"); } catch (ClassNotFoundException e) { System.exit(1); }System.out.println("c1 is interface? " + c1.isInterface()); System.out.println("c2 is interface? " + c2.isInterface()); Class[] cc = c1.getInterfaces(); for (Class face : cc) { System.out.println("face name is " + face.getName()); } Class parent = c1.getSuperclass(); System.out.println("parent is " + parent.getName()); Object obj = null; try { obj = parent.newInstance(); }catch (InstantiationException e){ System.exit(1); }catch (IllegalAccessException e){ System.exit(1); } System.out.println(" name is "+((Person)obj).getName()+"age is "+((Person) obj).getAge()); } }

输出:
c1 is interface? false c2 is interface? true face name is com.test.Run face name is com.test.Jump parent is com.test.Person name is defaultNameage is 0

类字面量语法 生成对Class对象的引用,即使用类字面常量。就像下面这样:
FancyToy.class

类字面常量不仅可以应用于普通的类,也可以应用于接口、数组以及基本数据类型。另外基本数据类型的包装器类,还有一个标准的字段TYPE。TYPE字段是一个引用,指向对应的基本数据类型Class对象。如下所示:
..... 等介于....
boolean.class Boolean.TYPE
char.class Character.TYPE
byte.class Byte.TYPE
short.class Short.TYPE
int.class Integer.TYPE
long.class Long.TYPE
float.class Float.TYPE
double.class Double.TYPE
void.class Void.TYPE
注意:当使用".class"来创建对Class对象的引用时,不会自动地初始化该Class对象。
【Class对象】初始化被延迟到了对静态方法或非常数静态域进行首次引用时才执行。

    推荐阅读