class 类
class(包括interface)的本质是就是一种数据类型(Type),class是由JVM在执行过程中动态加载的。JVM在第一次读取到某种class类型时,将其加载进内存。
每加载一种class,JVM就创建一个对应Class类型的实例,并关联起来。
以String类为例,当JVM加载String类时,它首先读取String.class文件到内存,然后,为String类创建一个Class实例并关联起来.
由于JVM为每个加载的class创建了对应的Class实例,并在实例中保存了该class(Class对象就是一个简单的类,类名为Class,其实例对象记录了某一类的具体信息,对任意的一个Object实例,只要我们获取了它的Class,就可以获取它的一切信息。)的所有信息,包括类名、包名、父类、实现的接口、所有方法、字段等,因此,如果获取了某个Class实例,我们就可以通过这个Class实例获取到该实例对应的class的所有信息。
这种通过Class实例获取class信息的方法称为反射(Reflection)。
获取一个Class实例
获取class的Class实例的三个方法:
- 通过类的静态变量class获取:Class cls = String.class;
- 通过实例变量的getClass()获取:String s = “Hello”;Class cls = s.getClass();
- 根据class的全限定名获取:Class cls = Class.forName(“java.lang.String”);
因为Class实例在JVM中是唯一(单例)的,所以,上述方法获取的Class实例是同一个实例。
@SuppressWarnings("rawtypes")
public static void main(String[] args) throws ClassNotFoundException {
// 通过类的静态变量class获取
Class cls1 = String.class;
// 通过实例变量的getClass()获取
String str = "str";
Class cls2 = str.getClass();
// 通过类的全限定名获取
Class cls3 = Class.forName("java.lang.String");
// Class对象在JVM中是单例模式的,所以三种方式获取到的Class对象都是同一个对象
System.out.println(cls1 == cls2); // true
System.out.println(cls1 == cls3); // true
System.out.println(cls2 == cls3); // true
}
通过Class实例创建对应的实例对象
@SuppressWarnings("rawtypes")
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class cls = Class.forName("java.lang.String");
String str = (String) cls.newInstance(); // == new String();
}
Class API
Modifier and Type | Method | Description | Sample Code |
---|---|---|---|
<U> Class<? extends U> | asSubclass(Class<U> clazz) | ||
T | cast(Object obj) | ||
boolean | desiredAssertionStatus() | ||
static Class<?> | forName(String className) | 根据类的全限定名返回类的Class实例 | Class.forName(“java.lang.String”) |
static Class<?> | forName(String name, boolean initialize, ClassLoader loader) | ||
AnnotatedType[] | getAnnotatedInterfaces() | ||
AnnotatedType | getAnnotatedSuperclass() | ||
<A extends Annotation> A | getAnnotation(Class<A> annotationClass) | ||
Annotation[] | getAnnotations() | 返回此类对象上存在的注解 | |
<A extends Annotation> A[] | getAnnotationsByType(Class<A> annotationClass) | ||
String | getCanonicalName() | ||
Class<?>[] | getClasses() | 返回类定义的公共的内部类,以及从父类、父接口那里继承来的内部类 | |
ClassLoader | getClassLoader() | ||
Class<?> | getComponentType() | ||
Constructor<T> | getConstructor(Class<?>… parameterTypes) | ||
Constructor<?>[] | getConstructors() | ||
<A extends Annotation> A | getDeclaredAnnotation(Class<A> annotationClass) | ||
Annotation[] | getDeclaredAnnotations() | ||
<A extends Annotation> A[] | getDeclaredAnnotationsByType(Class<A> annotationClass) | ||
Class<?>[] | getDeclaredClasses() | 返回类中定义的公共、私有、保护的内部类 | |
Constructor<T> | getDeclaredConstructor(Class<?>… parameterTypes) | ||
Constructor<?>[] | getDeclaredConstructors() | ||
Field | getDeclaredField(String name) | ||
Field[] | getDeclaredFields() | ||
Method | getDeclaredMethod(String name, Class<?>… parameterTypes) | ||
Method[] | getDeclaredMethods() | ||
Class<?> | getDeclaringClass() | ||
Class<?> | getEnclosingClass() | ||
Constructor<?> | getEnclosingConstructor() | ||
Method | getEnclosingMethod() | ||
T[] | getEnumConstants() | ||
Field | getField(String name) | 返回指定字段对象 | |
Field[] | getFields() | 返回所有字段对象 | |
Type[] | getGenericInterfaces() | ||
Type | getGenericSuperclass() | ||
Class<?>[] | getInterfaces() | ||
Method | getMethod(String name, Class<?>… parameterTypes) | 返回指定方法对象 | |
Method[] | getMethods() | 返回所有方法对象 | |
int | getModifiers() | 返回Class对应类(或者接口)的修饰符 | |
String | getName() | 返回此类对象所表示类的全限定名 | |
Package | getPackage() | 返回此类对象所表示的类所在的包名 | |
ProtectionDomain | getProtectionDomain() | ||
URL | getResource(String name) | ||
InputStream | getResourceAsStream(String name) | ||
Object[] | getSigners() | ||
String | getSimpleName() | 返回此对象所表示类的类名 | |
Class<? super T> | getSuperclass() | 返回此对象所表示类的父类对象 | |
String | getTypeName() | ||
TypeVariable<Class<T>>[] | getTypeParameters() | ||
boolean | isAnnotation() | 此类对象是否表示注解类型 | Class.forName(“javax.xml.ws.ServiceMode”).isAnnotation() //true |
boolean | isAnnotationPresent(Class<? extends Annotation> annotationClass) | ||
boolean | isAnonymousClass() | ||
boolean | isArray() | 此类对象是否表示数组类 | |
boolean | isAssignableFrom(Class<?> cls) | ||
boolean | isEnum() | 此类对象是否表示enum类型 | |
boolean | isInstance(Object obj) | ||
boolean | isInterface() | 判断当前类对象表示的类是否为接口 | Class.forName(“javax.xml.ws.ServiceMode”).isInterface() //true |
boolean | isLocalClass() | ||
boolean | isMemberClass() | ||
boolean | isPrimitive() | ||
boolean | isSynthetic() | 如果该类是合成类,则返回true;否则返回false。 | |
T | newInstance() | 创建由这个类对象表示的类的实例对象。 | String str = (String) Class.forName(“java.lang.String”).newInstance(); // == new String(); |
String | toGenericString() | 返回该class对象所表示的类的修饰符 | Class.forName(“java.lang.String”).toGenericString(); <br> 结果:public final class java.lang.String |
String | toString() | 将对象转换为string对象 |