java注解和反射(四)--- Class类

1. Class类

[1] 对象照镜子后可以得到信息: 某个类的属性,方法和构造器,某个类到低实现了哪些接口。对于每个类而言, JRE都为其保留了一个不变的Class类型对象。
一个Class对象包含了特定某个结构(class/interface/enum(枚举)/annotation(注解)/primitive type(基本类型)/void[]) 的相关信息

  • Class 本身也是一个类
  • Class对象只能由系统建立对象
  • 一个加载的类在JVM中只会有一个Class实例
  • 一个Class对象对应的是一个加载到JVM中的一个.class文件
  • 每个类的实例都会记得自己是由那个Class类锁生成的
  • 通过Class可以完整地得到一个类中所有加载的结构
  • Class类是Reflection的根源,针对任何你想动态加载,运行的类,唯有先获得Class对象

Class类常用的方法在这里插入图片描述
获得Class的实例的方式
<1> 若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高

Class clazz = Person.class

<2> 已知某个具体类的实例,调用实例的getClass() 方法获取Class对象

//person为类Person的实例
Class clazz = person.getClass();

<3> 已知一个类的全类名,且该类在类路径下,通过Class类的静态方法forName() 获取,抛出ClassNotFoundException

//若在项目路径下存在 demo01/Student 的类
Class clazz = Class.forName("demo01.Student");

<4> 内置基本数据类型可以直接用 类名.Type
<5> 还可以利用ClassLoader加载

相关测试

package com.gs.reflection;

//测试Class类的创建方式有哪些
public class test03 {
    public static void main(String[] args) throws ClassNotFoundException {
        Person person = new Student();
        System.out.println("这个人是:"+person.name);

        // 方式一: 通过对象获得
        Class c1 = person.getClass();
        System.out.println(c1.hashCode());

        // 方式二: forName获得
        Class c2 = Class.forName("com.gs.reflection.Student");
        System.out.println(c2.hashCode());

        //方式三: 通过类名.class获得
        Class c3 = Student.class;
        System.out.println(c3.hashCode());

        //方式四: 基本内置类型的包装类都有一个Type属性
        Class c4 = Integer.TYPE;
        System.out.println(c4);

        //获得父类类型
        Class c5 = c1.getSuperclass();
        System.out.println(c5);
    }
}

class Person{
    public String name;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }
}

class Student extends Person{
    public Student() {
        this.name = "学生";
    }
}

class Teacher extends Person{
    public Teacher() {
       this.name = "老师";
    }
}

[2] 哪些类可以有Class对象

  • class: 外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类
  • interface: 接口
  • [ ]: 数组
  • enum : 枚举
  • annotation: 注解@interface
  • primitive type: 基本数据类型
  • void
    相关测试
package com.gs.reflection;

import java.lang.annotation.ElementType;

//所有类型的Class
public class test04 {
    public static void main(String[] args) {
        //alt键可以进行多选  ctrl+d可以复制一行
        Class c1 = Object.class;   //类
        Class c2 = Comparable.class;  //接口
        Class c3 = String[].class;  //一维数组
        Class c4 = int[][].class; // 二维数组
        Class c5 = Override.class; //注解
        Class c6 = ElementType.class; //枚举
        Class c7 = Integer.class; //基本数据类型
        Class c8 = void.class; // void
        Class c9 = Class.class; // Class

        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
        System.out.println(c4);
        System.out.println(c5);
        System.out.println(c6);
        System.out.println(c7);
        System.out.println(c8);
        System.out.println(c9);

        //只要元素类型与维度一样,就是同一个Class(a的hash值与b是相等的)
        int [] a = new int[10];
        int [] b = new int[100];
        String[] c = new String[100];
        System.out.println(a.getClass().hashCode());
        System.out.println(b.getClass().hashCode());
        System.out.println(c.getClass().hashCode());
    }
}

发布了82 篇原创文章 · 获赞 6 · 访问量 6873

猜你喜欢

转载自blog.csdn.net/TheWindOfSon/article/details/105492929