检索类对象

原文: https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html

所有反射操作的入口点是 java.lang.Class 。除 java.lang.reflect.ReflectPermission 外, java.lang.reflect 中没有一类具有公共构建体。要进入这些类,有必要在 Class 上调用适当的方法。根据代码是否可以访问对象,类的名称,类型或现有的 Class ,有几种方法可以获得 Class

Object.getClass()

如果对象的实例可用,则获取其 Class 的最简单方法是调用 Object.getClass() 。当然,这仅适用于所有继承自 Object 的参考类型。一些例子如下。

  1. Class c = "foo".getClass();

返回 StringClass

  1. Class c = System.console().getClass();

有一个与static方法 System.console() 返回的虚拟机关联的唯一控制台。 getClass() 返回的值是对应于 java.io.ConsoleClass

  1. enum E { A, B }
  2. Class c = A.getClass();

A是枚举E的实例;因此 getClass() 返回对应于枚举类型EClass

  1. byte[] bytes = new byte[1024];
  2. Class c = bytes.getClass();

由于数组是 Objects ,因此也可以在数组实例上调用 getClass() 。返回的 Class 对应于组件类型为byte的数组。

  1. import java.util.HashSet;
  2. import java.util.Set;
  3. Set<String> s = new HashSet<String>();
  4. Class c = s.getClass();

在这种情况下, java.util.Setjava.util.HashSet 类型的对象的接口。 getClass() 返回的值是 java.util.HashSet 对应的类别。

.class 语法

如果类型可用但没有实例,则可以通过将".class"附加到类型名称来获得 Class 。这也是获得原始类型的 Class 的最简单方法。

  1. boolean b;
  2. Class c = b.getClass(); // compile-time error
  3. Class c = boolean.class; // correct

请注意,语句boolean.getClass()会产生编译时错误,因为boolean是基本类型,无法解除引用。 .class语法返回与boolean类型对应的 Class

  1. Class c = java.io.PrintStream.class;

变量c将是与 java.io.PrintStream 类型对应的 Class

  1. Class c = int[][][].class;

.class语法可用于检索对应于给定类型的多维阵列的 Class

的 Class.forName()

如果类的完全限定名称可用,则可以使用静态方法 Class.forName() 获得相应的 Class 。这不能用于原始类型。 Class.getName() 描述了数组类名称的语法。此语法适用于引用和基元类型。

  1. Class c = Class.forName("com.duke.MyLocaleServiceProvider");

此语句将根据给定的完全限定名称创建一个类。

  1. Class cDoubleArray = Class.forName("[D");
  2. Class cStringArray = Class.forName("[[Ljava.lang.String;");

变量cDoubleArray将包含对应于基本类型double的数组的 Class (即与double[].class相同)。 cStringArray变量将包含对应于 String 的二维阵列的 Class (即与String[][].class相同)。

原始类型包装的 TYPE 字段

.class语法是获取原始类型的 Class 的更方便和优选的方法;然而,有另一种方法来获得 Class 。每个基本类型和voidjava.lang 中都有一个包装类,用于将基元类型装箱到引用类型。每个包装类包含一个名为TYPE的字段,它等于被包装的基本类型的 Class

  1. Class c = Double.TYPE;

有一个类 java.lang.Double ,用于在需要 Object 时包装原始类型doubleDouble.TYPE 的值与double.class的值相同。

  1. Class c = Void.TYPE;

Void.TYPEvoid.class相同。

返回类的方法

有几个 Reflection API 返回类,但只有在直接或间接获得 Class 时才能访问这些类。

Class.getSuperclass()

Returns the super class for the given class.

  1. Class c = javax.swing.JButton.class.getSuperclass();

The super class of javax.swing.JButton is javax.swing.AbstractButton.

Class.getClasses()

Returns all the public classes, interfaces, and enums that are members of the class including inherited members.

  1. Class&lt;?&gt;[] c = Character.class.getClasses();

Character contains two member classes Character.Subset and Character.UnicodeBlock.

Class.getDeclaredClasses()

Returns all of the classes interfaces, and enums that are explicitly declared in this class.

  1. Class&lt;?&gt;[] c = Character.class.getDeclaredClasses();

Character contains two public member classes Character.Subset and Character.UnicodeBlock and one private class Character.CharacterCache.

Class.getDeclaringClass() java.lang.reflect.Field.getDeclaringClass() java.lang.reflect.Method.getDeclaringClass() java.lang.reflect.Constructor.getDeclaringClass()

Returns the Class in which these members were declared. Anonymous Class Declarations will not have a declaring class but will have an enclosing class.

  1. import java.lang.reflect.Field;
  2. Field f = System.class.getField("out");
  3. Class c = f.getDeclaringClass();

The field out is declared in System.

  1. public class MyClass {
  2. static Object o = new Object() {
  3. public void m() {}
  4. };
  5. static Class&lt;c&gt; = o.getClass().getEnclosingClass();
  6. }

The declaring class of the anonymous class defined by o is null.

Class.getEnclosingClass()

Returns the immediately enclosing class of the class.

  1. Class c = Thread.State.class().getEnclosingClass();

The enclosing class of the enum Thread.State is Thread.

  1. public class MyClass {
  2. static Object o = new Object() {
  3. public void m() {}
  4. };
  5. static Class&lt;c&gt; = o.getClass().getEnclosingClass();
  6. }

The anonymous class defined by o is enclosed by MyClass.