Class类

反射库提供了一个丰富且精巧的工具集,可以用来编写能够动态操控Java代码的程序。能够分析类能力的程序称为反射,反射机制功能强大。

Class类

在java运行期间,Java运行时系统始终为所有对象维护一个运行时类型标识。这个信息就会跟踪每个对象所属的类。保存这些信息的类名为Class,可以使用Object类中的getClass方法获取Class类实例。

获取Class类实例的方法

有三种方法可以获取Class类实例:

1.通过对象实例的getClass方法获取

String str = "java";
Class c = str.getClass();

2.通过Class的静态方法forName获取。注意,若该方法传入的字符串不是一个类名或接口名,会抛出异常。

public static void main (String[] args) throws ClassNotFoundException
{
    String str = "java.lang.String";
    Class c = Class.forName(str);
}

3通过T.class获取Class实例。

Class c1 = String.class;
Class c2 = Employee.class;

Class实例展示

Class c1 = Object.class;
Class c2 = Comparable.class;
Class c3 = String[].class;
Class c4 = int[][].class;
Class c5 = ElementType.class;
Class c6 = Override.class;
Class c7 = int.class;
Class c8 = void.class;
Class c9 = Class.class;
int[] a = new int[10];
int[] b = new int[100];
Class c10 = a.getClass();
Class c11 = b.getClass();

// 只要元素类型与维度一样,就是同一个Class
System.out.println(c10 == c11);

Class实例的比较

虚拟机为每个类型管理一个唯一的Class对象。因此,可以利用==运算符来对两个Class实例进行比较。

var str = String.class == "java".getClass() ?
    "equal" : "not eaual";

Class类的常用方法

方法名 功能说明
static Class forName(String name) 返回指定类名 name 的 Class 对象
Object newInstance() 调用缺省构造函数,返回该Class对象的一个实例
String getName() 获取完整的类名称,包括包名
String getSimpleName 获取类名称,不包括包名
String getPackageName() 获取包名称 (9.0新增)
boolean isArray() 是否为一个数组
isEnum() ……
isInterface() ……
Class getSuperClass() 返回当前Class对象的父类的Class对象
Class [] getInterfaces() 获取当前Class对象的接口
ClassLoader getClassLoader() 返回该类的类加载器
Constructor[] getConstructors() 返回一个包含某些Constructor对象的数组
Field[] getDeclaredFields() 返回Field对象的一个数组
Method getMethod(String name,Class … paramTypes) 返回一个Method对象,此对象的形参类型为paramType
public class Demo5
{
    public static void main (String[] args) throws ClassNotFoundException
    {
        printClassInfo("".getClass());
        printClassInfo(Runnable.class);
        printClassInfo(java.time.Month.class);
        printClassInfo(int[].class);
    }

    private static void printClassInfo (Class c)
    {
        System.out.println("full name is:"+c.getName());
        System.out.println("simple name is:"+c.getSimpleName());
        System.out.println("package name is:"+c.getPackageName());
        System.out.println("is Array:"+c.isArray());
        System.out.println("is enum:"+c.isEnum());
        System.out.println("is interface:"+c.isInterface());
    }
}