15_Java反射机制——2.理解Class类并获取Class实例
1、Class类的理解
- 1、在Object类中定义了,public final Class getClass(),此方法被所有子类继承。Class类是Java反射的源头,从程序的运行结果来看反射,即通过对象反射出类的名称。
- 2、类加载的过程(将字节码文件加载到内存中的过程)
1)、使用 javac.exe 命令将 类名.java文件,编译为类名.class文件。
2)、使用 java.exe 命令将 类名.class文件,加载到内存中,并解释运行。
3)、加载到内存中的类,称为运行时类,一个类名.class文件对应一个运行时类,也就是Class类的一个实例。
2、获取Class类的实例(四种方法)
- 1、已知具体的类,调用运行时类的class属性,该方法最为安全可靠,程序性能最高。
- 2、已知类的实例,通过运行时类的实例,调用getClass() 方法
- 3、已知类的全类名,且该类在类路径下,在通过Class类的静态方法forName(),可能抛出ClassNotFoundException
- 4、通过类加载器ClassLoader(了解即可)
example1
@Test
void testPerson3() throws ClassNotFoundException {
// 方式一: 调用运行时类的class属性
Class clazz1 = Person.class;
System.out.println(clazz1); // class main.java.com.atzwx.reflection.Person
System.out.println("*********");
// 方式二: 通过运行时类的对象, 调用getClass()方法
Person person = new Person();
Class clazz2 = person.getClass();
System.out.println(clazz2); // class main.java.com.atzwx.reflection.Person
System.out.println("*********");
// 方式三: 调用Class类的静态方法——forName(), 注意可能抛出 ClassNotFoundException
Class clazz3 = Class.forName("main.java.com.atzwx.reflection.Person"); // class main.java.com.atzwx.reflection.Person
System.out.println(clazz3);
System.out.println("*********");
// 方式四: 通过类的加载器——ClassLoader(了解即可)
ClassLoader classLoader = this.getClass().getClassLoader();
Class clazz4 = classLoader.loadClass("main.java.com.atzwx.reflection.Person");
System.out.println(clazz4); // class main.java.com.atzwx.reflection.Person
}
output
class main.java.com.atzwx.reflection.Person
*********
class main.java.com.atzwx.reflection.Person
*********
class main.java.com.atzwx.reflection.Person
*********
class main.java.com.atzwx.reflection.Person
3、哪些类型可以有Class对象
- 1、class-类
- 2、interface-接口
- 3、enum-枚举
- 4、[]-数组
- 5、annotation-注解@interface
- 6、primitive type-基本类型
- 7、void
example2
@Test
void testPerson4() {
Class<Object> clazz1 = Object.class;
Class<Comparable> clazz2 = Comparable.class;
Class<String> clazz3 = String.class;
Class<int[]> clazz4 = int[].class;
Class<ElementType> clazz5 = ElementType.class;
Class<Override> clazz6 = Override.class;
Class<Integer> clazz7 = int.class;
Class<Void> clazz8 = void.class;
Class<Class> clazz9 = Class.class;
System.out.println("Object: " + clazz1); // Object: class java.lang.Object
System.out.println("Comparable: " + clazz2); // Comparable: interface java.lang.Comparable
System.out.println("String: " + clazz3); // String: class java.lang.String
System.out.println("int[]: " + clazz4); // int[]: class []
System.out.println("ElementType: " + clazz5); // ElementType: class java.lang.annotation.ElementType
System.out.println("Override: " + clazz6); // Override: interface java.lang.Override
System.out.println("Integer(int): " + clazz7); // Integer(int): int
System.out.println("Void: " + clazz8); // Void: void
System.out.println("Class: " + clazz9); // Class: class java.lang.Class
int[] a = new int[10];
int[] b = new int[100];
Class clazz10 = a.getClass();
Class clazz11 = b.getClass();
// 只要数组的元素类型与维度一样, 就是同一个Class
System.out.println(clazz10 == clazz11); // true
}