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 @   hellozwx  阅读(282)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
历史上的今天:
2019-08-29 Centos7——14.进程管理
点击右上角即可分享
微信分享提示