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());
}
}