测试中需要用到的代码 |
InterfaceA代码: package jichu; interface InterfaceA { String s1 = "this is s1 in InterfaceA"; public String method1(); } ClassA代码: package jichu; public class ClassA { private String s1 = "this is s1 in ClassA"; private String s2 = "this is s2 in ClassA"; public String method1() { return "this is method1 in ClassA"; } public String method2() { return "this is method2 in ClassA"; } class Inner { private String s1 = "this is s1 in Inner"; private String method1() { return "this is method1 in Inner"; } } } ClassB代码: package jichu; public class ClassB { } |
Class类 |
位置:java.lang包中 |
声明:public final class Class<T>implements java.io.Serializable, java.lang.reflect.GenericDeclaration,java.lang.reflect.Type,java.lang.reflect.AnnotatedElement class 类有final 修饰,可知他不能被子类继承;并且它实现了多个接口。 |
类型参数:T - 由此 Class 对象建模的类的类型。例如,String.class 的类型是 Class<String>。如果将被建模的类未知,则使用 Class<?>。 |
介绍:Class是一个java中的泛型类型。Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。 |
字段 |
private static final int ANNOTATION= 0x00002000; private static final int ENUM = 0x00004000; private static final int SYNTHETIC = 0x00001000; |
构造器 |
private Class() {}
构造器是私有的,可知不能通过new创建Class对象。 如何得到Class类的实例?
|
getName方法 |
||||||||||||||||||||
public String getName() |
||||||||||||||||||||
以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。 如果此类对象表示一个基本类型或 void,则返回的名字是一个与该基本类型或 void 所对应的 Java 语言关键字相同的String。 如果此类对象表示一个数组类,则名字的内部形式为:表示该数组嵌套深度的一个或多个 '[' 字符加元素类型名。元素类型名的编码如下:
|
toString方法 |
public String toString() |
重写了Object类的toString方法。 public String toString() { return (isInterface() ? "interface " : (isPrimitive() ? "" : "class ")) + getName(); } 如果是接口,则返回"interface "+getName();否则如果是基本类型,则返回getName();否则返回"class "+getName()。 |
测试: Class c1 = ClassA.class; System.out.println(c1.toString());// class jichu.ClassA Class c2 = InterfaceA.class; System.out.println(c2.toString());// interface jichu.InterfaceA Class c3 = int.class; System.out.println(c3.toString());// int Class c4 = int[].class; System.out.println(c4.toString());// class [I Class c5 = void.class; System.out.println(c5.toString());// void Class c6 = (new ClassA().new Inner()).getClass(); System.out.println(c6.toString());// class jichu.ClassA$Inner |
获取Class对象 |
|||||
|
|||||
|
|||||
|
|||||
|
判断型方法 |
public native boolean isInstance(Object obj); |
判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。此方法是 Java 语言 instanceof 运算符的动态等效方法。 |
public native boolean isArray(); |
判定此 Class 对象是否表示一个数组类。 |
public native boolean isPrimitive(); |
判定指定的 Class 对象是否表示一个基本类型。 |
public native boolean isInterface(); |
判定指定的 Class 对象是否表示一个接口类型。 |
public boolean isMemberClass(); |
当且仅当底层类是成员类时返回 true。 |
测试: Class c1 = ClassA.class; System.out.println(c1.isInstance(new ClassA()));// true System.out.println(c1.isInstance(new ClassB()));// false Class c2 = InterfaceA.class; System.out.println(c2.isInterface());// true Class c3 = int.class; System.out.println(c3.isPrimitive());// true Class c4 = int[].class; System.out.println(c4.isArray());// true Class c5 = void.class; System.out.println(c5.isPrimitive());// true Class c6 = (new ClassA().new Inner()).getClass(); System.out.println(c6.isMemberClass());// true |
获取类型信息 |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
创建实例 |
public T newInstance() throws InstantiationException, IllegalAccessException |
创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化这个类。 |
测试: Class c = Class.forName("jichu.ClassA"); ClassA o1 = (ClassA) c.newInstance(); ClassA o2 = (ClassA) c.newInstance(); System.out.println(o1.method1());// this is method1 in ClassA System.out.println(o1 == o2);// false |