Использование 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.class, float.class или boolean.class. Этот класс также используется для представления экземпляра массива в java. Каждая картина с   То же    type и одно и то же измерение разделяет  То же  Экземпляр   Класс  Класс. Еще одно использование java.lang.Class, при реализации equals() для проверки того, что два объекта должны То же  type или 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 являются экземплярами разных классов");
}

Integer 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 являются экземплярами разных классов");
}
}
Runtime:

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();
}
Runtime:

java.lang.String
String
java.lang.String
Есть и другие методы проверки типа class:
isEnum(): возвращает true, если тип является перечислением.
isArray(): возвращает true, если тип является массивом.
isInstance(Object o): возвращает true, если класс является экземпляром объекта o.
isLocal(): возвращает true, если класс объявлен локально.

String str1 = new String(); 
String[] array = {"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

Получить конструкторы, интерфейсы и методы класса

Еще одно преимущество использования java.lang.Class  заключается в том, что мы можем отобразить все списки конструкторов, атрибутов, методов и интерфейсов, используя следующие методы:

java.lang.Class.getConstructors(): Возвращает массив, содержащий все объекты Constructor, относящиеся к публичным конструкторам класса. Массив размера 0 возвращается, если класс не имеет открытых конструкторов или если класс является массивом.

java.lang.Class.getMethods()возвращает массив, содержащий все методы-члены класса или интерфейса, включая методы, объявленные в классе или интерфейсе, или методы, унаследованные от родительского класса и родительских интерфейсов. Массив размера 0 возвращается, если класс не имеет открытого метода, или если класс является массивом.

java.lang.Class.getInterfaces(): Этот метод определяет, какие интерфейсы реализуются классом или представлены этим объектом. Она  Возвращает массив, содержащий все интерфейсы в классе, включая те, которые объявлены в классе или унаследованы от родительского класса. Массив размера 0 возвращается, если класс не имеет открытого интерфейса или если класс является массивом.

Использовать эти три метода легко, как показано в следующем коде:

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

System.out.println("Конструкторы "+button.getClass());
Конструктор [] c = button.getClass().getConstructors();
for(int i=0; Я< в) длина; i++)
System.out.println(c[i]);

System.out.println("Интерфейсы "+button.getClass());
java.lang.Class [] interfaces = button.getClass().getInterfaces();
for(int i=0; Я< interfaces.length; i++)
System.out.println(interfaces[i]);

System.out.println("Методы "+button.getClass());
Method[] m = button.getClass().getMethods();
for(int i=0; Я< м.длина; i++)
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
< br />Методы класса 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.Class java.lang.Class.getSuperclass()
public native 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 boolean java.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.lang.Object java.lang.Class.cast(java.lang.Object)
public java.lang.Class[] 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.lang.Class.getPackage()
public java.net.URL java.lang.Class.getResource(java.lang.String)
public native 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 boolean 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.lang.ClassLoader java.lang.Class.getClassLoader()
public java.lang.reflect.Constructor java.lang.Class.getConstructor(java.lang.Class[]) выдает java.lang.NoSuchMethodException,java.lang.SecurityException
public java.lang.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.Constructor 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) throws 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.Class java.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()
public java.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() throws java.lang.InterruptedException
public boolean 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