检索类对象
原文: 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
的参考类型。一些例子如下。
Class c = "foo".getClass();
Class c = System.console().getClass();
有一个与static
方法 System.console()
返回的虚拟机关联的唯一控制台。 getClass()
返回的值是对应于 java.io.Console
的 Class
。
enum E { A, B }
Class c = A.getClass();
A
是枚举E
的实例;因此 getClass()
返回对应于枚举类型E
的 Class
。
byte[] bytes = new byte[1024];
Class c = bytes.getClass();
由于数组是 Objects
,因此也可以在数组实例上调用 getClass()
。返回的 Class
对应于组件类型为byte
的数组。
import java.util.HashSet;
import java.util.Set;
Set<String> s = new HashSet<String>();
Class c = s.getClass();
在这种情况下, java.util.Set
是 java.util.HashSet
类型的对象的接口。 getClass()
返回的值是 java.util.HashSet
对应的类别。
.class 语法
如果类型可用但没有实例,则可以通过将".class"
附加到类型名称来获得 Class
。这也是获得原始类型的 Class
的最简单方法。
boolean b;
Class c = b.getClass(); // compile-time error
Class c = boolean.class; // correct
请注意,语句boolean.getClass()
会产生编译时错误,因为boolean
是基本类型,无法解除引用。 .class
语法返回与boolean
类型对应的 Class
。
Class c = java.io.PrintStream.class;
变量c
将是与 java.io.PrintStream
类型对应的 Class
。
Class c = int[][][].class;
.class
语法可用于检索对应于给定类型的多维阵列的 Class
。
的 Class.forName()
如果类的完全限定名称可用,则可以使用静态方法 Class.forName()
获得相应的 Class
。这不能用于原始类型。 Class.getName()
描述了数组类名称的语法。此语法适用于引用和基元类型。
Class c = Class.forName("com.duke.MyLocaleServiceProvider");
此语句将根据给定的完全限定名称创建一个类。
Class cDoubleArray = Class.forName("[D");
Class cStringArray = Class.forName("[[Ljava.lang.String;");
变量cDoubleArray
将包含对应于基本类型double
的数组的 Class
(即与double[].class
相同)。 cStringArray
变量将包含对应于 String
的二维阵列的 Class
(即与String[][].class
相同)。
原始类型包装的 TYPE 字段
.class
语法是获取原始类型的 Class
的更方便和优选的方法;然而,有另一种方法来获得 Class
。每个基本类型和void
在 java.lang
中都有一个包装类,用于将基元类型装箱到引用类型。每个包装类包含一个名为TYPE
的字段,它等于被包装的基本类型的 Class
。
Class c = Double.TYPE;
有一个类 java.lang.Double
,用于在需要 Object
时包装原始类型double
。 Double.TYPE
的值与double.class
的值相同。
Class c = Void.TYPE;
Void.TYPE
与void.class
相同。
返回类的方法
有几个 Reflection API 返回类,但只有在直接或间接获得 Class
时才能访问这些类。
Returns the super class for the given class.
Class c = javax.swing.JButton.class.getSuperclass();
The super class of javax.swing.JButton
is javax.swing.AbstractButton
.
Returns all the public classes, interfaces, and enums that are members of the class including inherited members.
Class<?>[] c = Character.class.getClasses();
Character
contains two member classes Character.Subset
and Character.UnicodeBlock
.
Returns all of the classes interfaces, and enums that are explicitly declared in this class.
Class<?>[] 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.
import java.lang.reflect.Field;
Field f = System.class.getField("out");
Class c = f.getDeclaringClass();
The field out
is declared in System
.
public class MyClass {
static Object o = new Object() {
public void m() {}
};
static Class<c> = o.getClass().getEnclosingClass();
}
The declaring class of the anonymous class defined by o
is null
.
Returns the immediately enclosing class of the class.
Class c = Thread.State.class().getEnclosingClass();
The enclosing class of the enum Thread.State
is Thread
.
public class MyClass {
static Object o = new Object() {
public void m() {}
};
static Class<c> = o.getClass().getEnclosingClass();
}
The anonymous class defined by o
is enclosed by MyClass
.