0%

java | Class 类

Class 类的讲解。

对于每一个类而言,JRE 都为其保留了一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个结构 (class/interface/enum/annotation/primitive type/void/[])的有关信息。

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

Class 类的常用方法

方法名 功能说明
static ClassforName(String name) 返回指定类名 name 的 Class 对象
Object newInstance() 调用缺省构造函数,返回 Class 对象的一个实例
getName() 返回此 Class 对象所表示的实体 (类、接口、数组类或 void) 的名称
Class getSuperClass() 返回当前 Class 对象的父类的 Class 对象
Class[] getinterfaces() 获取当前 Class 对象的接口
ClassLoader getClassLoader() 返回该类的类加载器
Constructor[] getConstructors() 返回一个包含某些 Constructor 对象的数组
Method getMethod(String name,Class.. T) 返回一个 Method 对象,此对象的形参类型为 paramType
Field[] getDeclaredFields() 返回 Field 对象的一个数组
InputStream getResourceAsStream(String name) 返回输入流
用法 - java - Properties

获取 Class 类的实例

  • 获取已知的具体的类,通过类的 class 属性获取,此方法最安全可靠,性能最高

    • Class person = Person.class;
  • 已知某一个类的实例,通过调用该实例的 getClass() 方法获取 Class 对象

    • Class person = person.getClass();
  • 已知一个类的全类名,且该类在类路径下,通过获取 Class 类的静态方法 forName() 获取,可能抛除 ClassNotFoundException

    • Class person = Class.forName("path")
  • 内置基本数据类型可以直接 类名.Type

  • 还可以用 ClassLoader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.redisc;

class Person {
public String name;
}

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

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


public class Test {

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());
Class c2 = Class.forName("com.redisc.Student");
System.out.println(c2.hashCode());
Class c3 = Student.class;
System.out.println(c3.hashCode());

// 基本内置类型的包装类都有一个 type
Class c4 = Integer.TYPE;
// 获得父类类型
Class c5 = c1.getSuperclass();
System.out.println(c5);
}
}

哪些类型可以有 Class 对象

  • class: 外部类,成员(成员内部类、静态内部类)、局部内部类、匿名内部类
  • interface: 接口
  • []:数组
  • enum:枚举
  • annotation: 注解 @interface
  • primitive type: 基本数据类型
  • void
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test {

public static void main(String[] args) throws ClassNotFoundException {
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;
Class c9 = Class.class;
}
}
请我喝杯咖啡吧~