使用 java.lang.Class

java.lang.Class 是 Java 中重要的类之一,但很少被 Java 程序员注意到。此类非常有用,因为它具有多种方法,例如:getClass()forName()可用于加载类,还可以加载 Oracle 和 MySQL 驱动程序。Class 还提供了 Class.newInstance() 它允许您在不使用 new()java.lang.Class 没有公共构造函数,其实例由 JVM 在加载时创建。类的对象 Class 还用于表示正在运行的 Java 应用程序中的类、枚举、接口和注释。基元类型 byte、short、char、int、float、double 和 boolean 由 java.lang.Class。您可以获取实例 Class以这种方式对应:int.classfloat.classboolean.class。此类还用于表示 java 中数组的实例。每幅画都带有 相同  类型和相同维度共享 相同 的实例 班级 java.lang.Class,实现 equals() 检查两个对象是否到期相同 type or not.

对象 java.lang.Class 每次由描述对象类型的 JVM 创建。同一类的所有实例共享相同的对象 Class,你可以得到对象 Class通过调用方法 getClass()。此方法继承自 java.lang.Object.

假设在此示例中,我们创建了不同的实例来将它们与以下实例进行比较:

public static void main(String[] args) {

String str1 = new String(), str2 = new String();
System.out.println(str1.getClass().getName());
System.out.println(str2.getClass().getName());

if(str1.getClass().equals(str2.getClass())){
System.out.println(str1 和 str2 是同一类的实例”);
}else{
System.out.println(str1 和 str2 是不同类的实例”);
}

整数 A = new Integer(1);
布尔值 B = 新布尔值(true);
System.out.println(A.getClass().getName());
System.out.println(B.getClass().getName());

if(A.getClass().equals( B.getClass())){
System.out.println(A 和 B 是同一类的实例”);
}else{
System.out.println(A 和 B 是不同类的实例”);
}
}
运行时:

java.lang.String
java.lang.String
str1 和 str2 是同一类的实例
java.lang.Integer
java.lang.Boolean
A 和 B 是不同类的实例
我们需要方法 newInstance()forName()因为有时我们在运行时无法知道实例化类的名称,所以这些方法让我们的事情变得更简单。

try {
/*newInstance() 等价于 new String()*/
String str2 = str1.getClass().newInstance();
System.out.println(str2.getClass().getName());
System.out.println(str2.getClass().getSimpleName());
System.out.println(str2.getClass().getCanonicalName());

} catch (InstantiationException e) {
// TODO 自动生成的 catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO 自动生成的 catch block
e.printStackTrace();
}
运行时:

java.lang.String
String
java.lang.String
还有其他方法可以测试类的类型:
isEnum():如果类型是枚举.
isArray():如果类型为 array.
isInstance(对象 o):如果类是 o.
isLocal():如果类是在本地声明的,则返回 true。

String str1 = new String();
String[] 数组 = {aa”,bb”,cc”};
String[] array2 = {fd”,be”,ce”};
System.out.println(array.getClass().isArray());true
System.out.println(array.getClass().isInstance(array2));true
System.out.println(array.getClass().isLocalClass());false

获取 class 的构造函数、接口和方法

使用 java.lang.Class 就是我们可以使用以下方法显示构造函数、属性、方法和接口的所有列表:

java.lang.Class.getConstructors():返回一个数组,其中包含与类的公共构造函数相关的所有 Constructor 对象。如果类没有公共构造函数,或者该类是 array.

java.lang.Class.getMethods(): 返回一个数组,其中包含类或接口的所有成员方法,包括类或接口中声明的方法,或从父类和父接口继承的方法。如果类没有公共方法,或者该类是 array.

java.lang.Class.getInterfaces():此方法确定哪些接口由类实现或由该对象表示。她 返回一个数组,其中包含类中的所有接口,包括类中声明的接口或从父类继承的接口。如果类没有公共接口,或者该类是 array.

使用这三种方法很容易,如以下代码所示:

java.lang.Class button = Class.class.forName(javax.swing.JButton”);

System.out.println(+button.getClass()的构造函数);
构造函数<?>[] c = button.getClass().getConstructors();
for(int i=0;我 System.out.println(c[i]);

System.out.println(+button.getClass()的接口);
java.lang.Class<?>[] 接口 = button.getClass().getInterfaces();
for(int i=0;我<接口长度;i++)
System.out.println(interfaces[i]);

System.out.println(+button.getClass()的方法);
方法[] m = button.getClass().getMethods();
for(int i=0;我 System.out.println(m[i]);
运行这段代码会导致一长串 java.lang.String,所以我们只显示构造函数和接口的列表:

javax.swing.JButton

javax.swing.JButton
interface java.io.Serializable
interface java.lang.reflect.GenericDeclaration
interface java.lang.reflect.Type
interface java.lang.reflect.AnnotatedElement

Class 方法 javax.swing.JButton
public static java.lang.Class java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader) 抛出 java.lang.ClassNotFoundException
public static java.lang.Class java.lang.Class.forName(java.lang.String) 抛出 java.lang.ClassNotFoundException
public native boolean java.lang.Class.isAssignableFrom(java.lang.Class)
public native java.lang.Classjava.lang.Class.getSuperclass()
public 原生 java.lang.Class java.lang.Class.getComponentType()
public java.lang.String java.lang.Class.toString()
public native boolean java.lang.Class.isInstance(java.lang.Object)
public native int java.lang.Class.getModifiers()
public native boolean java.lang.Class.isInterface()
public native boolean java.lang.Class.isArray()
public native booleanjava.lang.Class.isPrimitive()
public java.lang.String java.lang.Class.getName()
public java.lang.Class java.lang.Class.asSubclass(java.lang.Class)
public java.lang.Object java.lang.Class.cast(java.lang.Object)
public java.lang.Class.getClasses()
public java.lang.reflect.Field java.lang.Class.getField(java.lang.String) 抛出 java.lang.NoSuchFieldException,java.lang.SecurityException
public java.lang.reflect.Field[] java.lang.Class.getFields() 抛出 java.lang.SecurityException
public java.lang.reflect.Method java.lang.Class.getMethod(java.lang.String,java.lang.Class[]) 抛出 java.lang.NoSuchMethodException,java.lang.SecurityException
public java.lang.Reflect.Method[] java.lang.Class.getMethods() 抛出 java.lang.SecurityException
public java.lang.Package.Class.getPackage()
publicjava.net.URL java.lang.Class.getResource(java.lang.String)
public 原生 java.lang.Object[] java.lang.Class.getSigners()
public boolean java.lang.Class.isAnnotation()
public boolean java.lang.Class.isEnum()
public boolean java.lang.Class.isLocalClass()
public boolean java.lang.Class.isSynthetic()
public java.lang.Object java.lang.Class.newInstance() 抛出 java.lang.InstantiationException,java.lang.IllegalAccessException
public 布尔值 java.lang.Class.desiredAssertionStatus()
public java.lang.annotation.Annotation java.lang.Class.getAnnotation(java.lang.Class)
public java.lang.annotation.Annotation[] java.lang.Class.getAnnotations()
public java.lang.String java.lang.Class.getCanonicalName()
public java.lang.ClassLoader java.lang.Class.getClassLoader()
publicjava.lang.reflect.构造函数 java.lang.Class.getConstructor(java.lang.Class[]) 抛出 java.lang.NoSuchMethodException,java.lang.SecurityException
public java.lang.reflect.Constructor[] java.lang.Class.getConstructors() 抛出 java.lang.SecurityException
public java.lang.annotation.Annotation[] java.lang.Class.getDeclaredAnnotations()
public java.lang.Class[] java.lang.Class.getDeclaredClasses() 抛出 java.lang.SecurityException
public java.lang.reflect.构造函数 java.lang.Class.getDeclaredConstructor(java.lang.Class[]) 抛出 java.lang.NoSuchMethodException,java.lang.SecurityException
public java.lang.reflect.Constructor[] java.lang.Class.getDeclaredConstructors() 抛出 java.lang.SecurityException
public java.lang.reflect.Field java.lang.Class.getDeclaredField(java.lang.String) 抛出 java.lang.NoSuchFieldException,java.lang.SecurityException
public java.lang.reflect.Field[] java.lang.Class.getDeclaredFields() 抛出 java.lang.SecurityException
public java.lang.reflect.Method java.lang.Class.getDeclaredMethod(java.lang.String,java.lang.Class[]) 抛出 java.lang.NoSuchMethodException,java.lang.SecurityException
public java.lang.reflect.Method[] java.lang.Class.getDeclaredMethods() 抛出 java.lang.SecurityException
public native java.lang.Classjava.lang.Class.getDeclaringClass()
public java.lang.Class java.lang.Class.getEnclosingClass()
public java.lang.reflect.Constructor java.lang.Class.getEnclosingConstructor()
public java.lang.reflect.method java.lang.Class.getEnclosingMethod()
public java.lang.Object[] java.lang.Class.getEnumConstants()
public java.lang.reflect.Type[] java.lang.Class.getGenericInterfaces()
publicjava.lang.reflect.Type java.lang.Class.getGenericSuperclass()
public native java.lang.Class[] java.lang.Class.getInterfaces()
public java.security.ProtectionDomain java.lang.Class.getProtectionDomain()
public java.io.InputStream java.lang.Class.getResourceAsStream(java.lang.String)
public java.lang.String java.lang.Class.getSimpleName()
public java.lang.reflect.TypeVariable[] java.lang.Class.getTypeParameters()
public boolean java.lang.Class.isAnnotationPresent(java.lang.Class)
public boolean java.lang.Class.isAnonymousClass()
public boolean java.lang.Class.isMemberClass()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() 抛出java.lang.InterruptedException
public 布尔值 java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
References:
Javadoc:java.lang.Class