getClass() 方法、Class 对象和反射介绍 - 1

“嗨,阿米戈!”

“现在是重头戏了。我们将熟悉 Class 类并接触反射。
正如您可能已经意识到的那样,Java 中的一切都是对象。对象需要什么?每个对象定义了什么这是怎么回事?”

“一类!”

“对!干得好。每个对象都有一个类。但是回到对象......有些对象完全包含一个实体,而其他对象只是帮助管理它。”

“后一种类型包括FileOutputStreamThread。当您创建Thread对象时,不会创建新线程。线程是在调用 start() 方法后由 Java 虚拟机创建的。该对象只是帮助管理进程。”

“与FileOutputStream相同:文件存储在磁盘上,操作系统管理存储和访问。但我们可以通过 File 对象与它交互,再次借助 Java 虚拟机。”

“是的,我已经明白了。”

“所以,有一个特殊的类,叫做Class,用于与类进行交互。”

“这不难猜。”

“是的。每次 Java 虚拟机将一个新类加载到内存中时,它都会创建一个 Class 对象,您可以使用它来获取有关加载类的特定信息。”

“每个类和对象都与一个 «类对象»相关联。”

例子 描述
Class clazz = Integer.class;
获取 Integer 类的 Class 对象。
Class clazz = int.class;
获取 int 类的 Class 对象。
Class clazz = "123".getClass();
获取 String 对象的 Class 对象。
Class clazz = new Object().getClass();
获取 Object 对象的 Class 对象。

“哇!真有趣!”

“你还记得类这个词Java中是关键字,不能用作变量名吗?”

“哦,是的,我知道,我知道。我只是忘记了。”

“您是否已经在某处使用了 Class 对象?”

“是的,我们在编写自己的 equals 方法实现时使用了它。”

“是的,您可以使用 getClass() 方法来测试对象是否具有相同的类。”

“你能用这个东西做什么?”

“好吧,很多事情:”

Java代码 描述
Class s = int.class;
String name = s.getName();
获取类名。
Class s = Class.forName("java.lang.String");
按名称获取类。
Object o1 = String.valueOf(1);
Object o2 = 123 + "T";
o1.getClass() == o2.getClass();
比较对象的类。

“有趣,但没有我想象的那么酷。”

“要酷吗?还有倒影, 倒影超酷。”

“什么是反射?”

"反射是一个类获取自身信息的能力。Java 有特殊的类:  FieldMethod,它们类似于类的Class类。就像Class对象让你获得一个类的信息一样,Field 对象提供一个字段的信息,并且 Method 对象提供有关方法的信息。看看你可以用它们做什么:“

Java代码 描述
Class[] interfaces = List.class.getInterfaces();
获取 List 类接口的 Class 对象列表
Class parent = String.class.getSuperclass();
获取String类的父类的Class对象
Method[] methods = List.class.getMethods();
获取 List 类的方法列表
String s = String.class.newInstance();
创建一个新的字符串
String s = String.class.newInstance();
Method m = String.class.getMethod("length");
int length = (int) m.invoke(s)
获取 String 类的 length 方法并在 String 上调用它

“哇!那真是太酷了!”