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
    }
posted @ 2020-08-29 12:01  hellozwx  阅读(270)  评论(0编辑  收藏  举报