Для каждого типа данных в runtime можно получить объект типа class
Everything I have tried so far always returns type Object rather than the specific type used.
29 Answers 29
As others mentioned, it's only possible via reflection in certain circumstances.
If you really need the type, this is the usual (type-safe) workaround pattern:
I like this answer but it's a little cumbersome to instantiate: GenericClass
Its even more verbose if you use a dao/factory/manager approach. Foo foo1 = GetDao
Thats true, but not working in all cases like stateless remote beans which are instantiated by container/reflection.
Just as a follow-up to my previous comment - after lot of pain playing with reflection, I ended up using this answer.
You can get around the superfluous reference by providing a generic static factory method. Something like public static
I have seen something like this
This technique works where the type parameter is defined on the immediate superclass, but it fails if the type parameter is defined elsewhere in the type hierarchy. For handling more complex cases something like TypeTools can be used. The docs include an example of a more sophisticated Generic DAO.
This only returns the actual type parameters used when a CLASS implements / extends something that has generic declarations, it does not return the actual type parameters used when an INSTANCE is instantiated. In other words, it CAN tell that in class A implements Comparable , the actual type parameter is String , but it CANNOT tell that in Set a = new TreeSet() , the actual type parameter is String . In fact, the type parameter information is "erased" after compilation, as explained in other answers.
@TomášZato Calling simply the code above returned the same exception for me. I know it's a bit late, but anyway, in my case, I had to call (Class
Generics are not reified at run-time. This means the information is not present at run-time.
Adding generics to Java while mantaining backward compatibility was a tour-de-force (you can see the seminal paper about it: Making the future safe for the past: adding genericity to the Java programming language).
There is a rich literature on the subject, and some people are dissatisfied with the current state, some says that actually it's a lure and there is no real need for it. You can read both links, I found them quite interesting.
@JoachimSauer, yes value types. I'd always wanted those in java. Btw what do you mean by specialized code?
@spaaarky21 No, generic type parameters are removed during compilation (so-called "erasure", you can google it). The trick in FrVaBe's answer works only if the type params of the superclass are known statically (see the first commment by Johnathn)
Java type erasure is a historical design flaw; more code has been written to get around it than was written to implement it.
A while back, I posted some full-fledge examples including abstract classes and subclasses here.
Note: this requires that you instantiate a subclass of GenericClass so it can bind the type parameter correctly. Otherwise it'll just return the type as T .
@CodyA.Ray Since this only works with subclasses of GenericClass , you should make that class abstract so wrong usage doesn’t compile.
Java generics are mostly compile time, this means that the type information is lost at runtime.
will be compiled to something like
To get the type information at runtime you have to add it as an argument of the ctor.
@PawelCioch missed a .getClass() to get the type from the created array. There doesn't seem to be a direct way to get an array class. Most Java collections just use Object[] instead.
Java does not use the information at run time, for backwards compatibility reasons. But the information is actually present as metadata and can be accessed via reflection (but it is still not used for type-checking).
From the official API:
However, for your scenario I would not use reflection. I'm personally more inclined to use that for framework code. In your case I would just add the type as a constructor param.
getActualTypeArguments only returns the type arguments for the immediate class. If you have a complex type hierarchy where T could be parameterized anywhere in the hierarchy, you'll need to do a bit of work to figure out what it is. This is more or less what TypeTools does.
This answer could be improved by adding some context or a code sample. I see method in the docs and I can find it actualTypeArguments via my IDE's debugger but I cannot figure out how to actually access it.
I'm upvoting this answer because it's a solution that works for the question being asked. However, for those who wants to navigate upward in class hierarchy like myself with more than one Generic class, this won't work. Because you will get java.lang.object instead of actual class.
If you want to navigate up in view hierarchy you can cast the genericSuperclass to Class and get the genericSuperclass. Prefereably in a loop.*>
I used follow approach:
I got "Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType" with this sample code
I dont think you can, Java uses type erasure when compiling so your code is compatible with applications and libraries that were created pre-generics.
From the Oracle Docs:
Type Erasure
Generics were introduced to the Java language to provide tighter type checks at compile time and to support generic programming. To implement generics, the Java compiler applies type erasure to:
Replace all type parameters in generic types with their bounds or Object if the type parameters are unbounded. The produced bytecode, therefore, contains only ordinary classes, interfaces, and methods. Insert type casts if necessary to preserve type safety. Generate bridge methods to preserve polymorphism in extended generic types. Type erasure ensures that no new classes are created for parameterized types; consequently, generics incur no runtime overhead.
Technique described in this article by Ian Robertson works for me.
In short quick and dirty example:
I think there is another elegant solution.
What you want to do is (safely) "pass" the type of the generic type parameter up from the concerete class to the superclass.
If you allow yourself to think of the class type as "metadata" on the class, that suggests the Java method for encoding metadata in at runtime: annotations.
First define a custom annotation along these lines:
You can then have to add the annotation to your subclass.
Then you can use this code to get the class type in your base class:
- You specify the generic type ( PassedGenericType ) in TWO places rather than one which is non-DRY.
- This is only possible if you can modify the concrete subclasses.
Yes, it's non-DRY, however it's cleaner than the extension approach suggested above. I liked it. thanks
This is my solution:
My code is not the exact solution for the question. It returns the generic type parameters of the class, but not the actual type of T. But it may be helpful for others who stumple upon the question and are looking for my solution.
Here's one way, which I've had to use once or twice:
This technically works, however it doesn't solve the general case, and I think that is what the original poster is after.
This doesn't deserve to be voted down like is has - the original poster hasn't been explicit. This answer offers a design pattern that does work and is easy to implement, provided it is suitable to make the generic class abstract.
One simple solution for this cab be like below
You can't. If you add a member variable of type T to the class (you don't even have to initialise it), you could use that to recover the type.
Here is working solution.
NOTES: Can be used only as superclass
1. Has to be extended with typed class ( Child extends Generic )
OR
2. Has to be created as anonymous implementation ( new Generic() <>; )
To complete some of the answers here, I had to get the ParametrizedType of MyGenericClass, no matter how high is the hierarchy, with the help of recursion:
Here is my solution
No matter how many level does your class hierarchy has, this solution still works, for example:
In this case, getMyType() = java.lang.String
This is not returning the type of T. It is returning T not java.lang.String besides the code is failing to covert Type to Class
I got Exception in thread "main" java.lang.NullPointerException at Main$ClassA.findTypeArguments(Main.java:54) at Main$ClassA.findTypeArguments(Main.java:54) at Main$ClassA.findTypeArguments(Main.java:54) at Main$ClassA.
Here is my trick:
Here is my solution. The examples should explain it. The only requirement is that a subclass must set the generic type, not an object.
Just in case you use store a variable using the generic type you can easily solve this problem adding a getClassType method as follows:
I use the provided class object later to check if it is an instance of a given class, as follows:
This is problematic, unfortunately. First of all, what if value is null ? Second of all, what if value is a subclass of T ? Constant
If you have a class like:
with T variable, then you can print T name:
Exactly so. If you already have an instance of the type, getting its class is no problem. The question is how to get it just from the class definition.
If you are working with spring:
By the way, GenericTypeResolver will still get null for the non-subclasses class like the question mentioned, because the generic info of such class was completely erased after compilation.
The only way to solve this question may be:
If you cannot change the generic class and use one of the method already explained on this page, then simple approach would be to get the type class based on the runtime instance class name.
I did the same as @Moesio Above but in Kotlin it could be done this way:
This was inspired by Pablo's and CoolMind's answers. Occasionally I have also used the technique from kayz1's answer (expressed in many other answers as well), and I believe it is a decent and reliable way to do what the OP asked.
I chose to define this as an interface (similar to PJWeisberg) first because I have existing types that would benefit from this functionality, particularly a heterogeneous generic union type:
Where my simple implementation in a generic anonymous interface implementation looks like the following:
I imagine this could be also implemented by being built with a class definition object as the source, that's just a separate use-case. I think the key is as many other answers have stated, in one way or another, you need to get the type information at runtime to have it available at runtime; the objects themselves maintain their type, but erasure (also as others have said, with appropriate references) causes any enclosing/container types to lose that type information.
Class ClassType Parameters: T - the type of the class modeled by this Class object. For example, the type of String.class is Class
Instances of the class Class represent classes and interfaces in a running Java application. An enum class and a record class are kinds of class; an annotation interface is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types ( boolean , byte , char , short , int , long , float , and double ), and the keyword void are also represented as Class objects.
The methods of class Class expose many characteristics of a class or interface. Most characteristics are derived from the class file that the class loader passed to the Java Virtual Machine or from the class file passed to Lookup::defineClass or Lookup::defineHiddenClass . A few characteristics are determined by the class loading environment at run time, such as the module returned by getModule() .
The following example uses a Class object to print the class name of an object:
It is also possible to get the Class object for a named class or interface (or for void ) using a class literal. For example:
Some methods of class Class expose whether the declaration of a class or interface in Java source code was enclosed within another declaration. Other methods describe how a class or interface is situated in a nest. A nest is a set of classes and interfaces, in the same run-time package, that allow mutual access to their private members. The classes and interfaces are known as nestmates. One nestmate acts as the nest host, and enumerates the other nestmates which belong to the nest; each of them in turn records it as the nest host. The classes and interfaces which belong to a nest, including its host, are determined when class files are generated, for example, a Java compiler will typically record a top-level class as the host of a nest where the other members are the classes and interfaces whose declarations are enclosed within the top-level class declaration.
Каждое Java-приложение имеет один экземпляр класса Runtime, который позволяет приложению взаимодействовать со средой, в которой выполняется приложение. Текущее время выполнения может быть получено из метода getRuntime .
Методы Java Runtime class:
1) public static Runtime getRuntime (): этот метод возвращает экземпляр или объект Runtime, связанный с текущим приложением Java.
// Java-программа для иллюстрации getRuntime ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
// получить текущее время выполнения, связанное с этим процессом
Runtime run = Runtime.getRuntime();
// выводим текущую свободную память для этой среды выполнения
2) public long freeMemory (): этот метод возвращает объем свободной памяти в JVM (виртуальная машина Java)
// Java-программа для иллюстрации freeMemory ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
// выводим количество свободных байтов
3) public long totalMemory (): этот метод возвращает объем общего объема памяти в JVM (виртуальная машина Java)
// Java-программа для иллюстрации totalMemory ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
// выводим количество байтов
4) открытый процесс exec (команда String) создает исключение IOException: этот метод выполняет данную команду в отдельном процессе.
Исключение:
1) SecurityException: Если менеджер безопасности существует и метод checkExec не позволяет создавать подпроцесс
2) IOException: если происходит ошибка ввода-вывода
3) NullPointerException: если команда пуста
4) IllegalArgumentException: если команда пуста
// Java-программа для иллюстрации процесса exec ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
// создаем процесс и запускаем google-chrome
Process process = Runtime.getRuntime().exec( "google-chrome" );
System.out.println( "Google Chrome successfully started" );
catch (Exception e)
Примечание: замените любое программное обеспечение, которое вы хотите запустить. Я работаю на Linux и Google-Chrome написан только так. Может отличаться в Windows / Mac.
5) public void addShutdownHook (Thread Hook): этот метод регистрирует новый поток хука завершения работы виртуальной машины.
Исключение:
2) IllegalStateException: если виртуальная машина уже находится в процессе выключения
3) SecurityException: если менеджер безопасности отрицает RuntimePermission («shutdownHooks»)
// Java-программа для иллюстрации addShutdownHook ()
// метод класса Runtime
public class GFG
// класс, который расширяет поток, который должен быть вызван при выходе из программы
static class Message extends Thread
public void run()
System.out.println( "Program exiting" );
public static void main(String[] args)
Runtime.getRuntime().addShutdownHook( new Message());
// заставляем нить спать 3 секунды
System.out.println( "Waiting for 5 seconds. " );
catch (Exception e)
// Java-программа для иллюстрации removeShutdownHook ()
// метод класса Runtime
public class GFG
// класс, который расширяет поток, который должен быть вызван при выходе из программы
static class Message extends Thread
public void run()
System.out.println( "Program exiting" );
public static void main(String[] args)
Message p = new Message();
// заставляем нить спать 3 секунды
System.out.println( "Waiting for 5 seconds. " );
catch (Exception e)
7) публичное ИНТ availableProcessors (): Этот метод возвращает число процессоров , доступных для JVM (Java Virtual Machine).
// Java-программа для иллюстрации availableProcessors ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
// проверяем количество доступных процессоров
8) public void exit (int status): этот метод завершает работающую в настоящее время виртуальную машину Java, инициируя ее последовательность завершения работы.
// Java-программа для иллюстрации exit ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
// заставить программу выйти
// Теперь ничего не будет работать.
System.out.println( "Program Running Check" );
9) public void traceInstructions (boolean a): этот метод включает или отключает трассировку инструкций. Если логический аргумент равен true, то он предполагает, что JVM (виртуальная машина Java) выдает отладочную информацию для каждой инструкции в виртуальной машине при ее выполнении.
// Java-программа для иллюстрации traceInstructions ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
// начать трассировку для инструкций
10) public void traceMethodCalls (boolean a): этот метод включает или отключает отслеживание вызовов методов. Если логический аргумент истинен, это предполагает, что виртуальная машина Java испускает отладочную информацию для каждого метода в виртуальной машине, как она вызывается.
// Java-программа для иллюстрации traceMethodCalls ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
// начать трассировку для инструкций
11) public void loadLibrary (String libname): этот метод загружает динамическую библиотеку с указанным именем библиотеки. Файл, содержащий код, загружается из локальной системы из места, где обычно получают библиотечные файлы.
Исключение:
1) UnsatisfiedLinkError: если библиотека не существует.
2) NullPointerException: если libname равно нулю.
3) SecurityException: если метод checkLink не разрешает загрузку указанной динамической библиотеки.
// Java-программа для иллюстрации loadLibrary ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
// загрузить библиотеку, которая является домашней / saket / папкой рабочего стола
System.out.println( "Library Loaded Successfully" );
12) public void load (String filename): этот метод загружает указанное имя файла в виде динамической библиотеки. Аргумент имени файла должен быть полным путем.
Исключение:
1) UnsatisfiedLinkError: если библиотека не существует.
2) NullPointerException: если Имя_библиотеки равно нулю.
3) SecurityException: если метод checkLink не разрешает загрузку указанной динамической библиотеки.
// Java-программа для иллюстрации load ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
// загрузить библиотеку, которая является домашней / saket / папкой рабочего стола
System.out.println( "Library Loaded Successfully" );
13) public void gc (): этот метод запускает сборщик мусора. Вызов этого метода предполагает, что виртуальная машина Java затрачивает усилия на утилизацию неиспользуемых объектов, чтобы сделать доступной память, которую они занимают, для быстрого повторного использования.
// Java-программа для иллюстрации gc ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
// запускаем сборщик мусора
14) public void runFinalization (): этот метод запускает методы финализации любых объектов, ожидающих финализации. Это предполагает, что HVM (виртуальная машина Java) затрачивает усилия на запуск методов финализации объектов, которые были обнаружены как отброшенные, но методы финализации которых еще не были запущены.
// Java-программа для иллюстрации runFinalization ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
15) public long maxMemory (): этот метод возвращает максимальный объем памяти, который виртуальная машина Java попытается использовать. Если нет внутреннего ограничения, то будет возвращено значение Long.MAX_VALUE.
// Java-программа для иллюстрации maxMemory ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
// выводим максимальную память
16) public void halt (int status): этот метод принудительно завершает работающую в данный момент виртуальную машину Java. Этот метод никогда не возвращается нормально. Этот метод следует использовать с особой осторожностью.
Исключение:
SecurityException: если менеджер безопасности присутствует, и его метод checkExit не разрешает выход с указанным статусом
// Java-программа для иллюстрации halt ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
// остановить этот процесс
// напечатать строку, просто чтобы увидеть, остановился ли процесс
System.out.println( "Process is still running." );
17) public Process exec (String [] cmd): этот метод выполняет указанную команду и аргументы в отдельном процессе. Это удобный метод.
Исключение:
1) IndexOutOfBoundsException: если cmd является пустым массивом (имеет длину 0)
2) NullPointerException: если libname равно нулю.
3) SecurityException: если метод checkLink не разрешает загрузку указанной динамической библиотеки.
4) IOException: если возникает ошибка ввода-вывода
// Java-программа для иллюстрации exec ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
String[] cmd = new String[ 2 ];
cmd[ 1 ] = "File.java" ;
// создаем процесс и выполняем cmdArray
Process process = Runtime.getRuntime().exec(cmd);
System.out.println( "File.java opening in atom" );
catch (Exception e)
18) public Process exec (String command, String [] envp, File dir): Этот метод выполняет указанную строковую команду в отдельном процессе с указанной средой и рабочим каталогом. Это удобный метод.
Исключение:
1) IndexOutOfBoundsException: если cmd является пустым массивом (имеет длину 0)
2) NullPointerException: если libname равно нулю.
3) SecurityException: если метод checkLink не допускает загрузку указанной библиотеки динамической.
4) IOException: если возникает ошибка ввода-вывода
// Java-программа для иллюстрации exec ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
// создаем файл с желаемым рабочим каталогом
File f = new File( "/home/saket/Desktop" );
// создаем процесс и выполняем gedit и currect среду
Process process = Runtime.getRuntime().exec( "gedit" , null , f);
System.out.println( "Gedit opening." );
catch (Exception e)
19) public Process exec (String command, String [] envp): Этот метод выполняет указанную строковую команду в отдельном процессе с указанной средой. Это удобный метод, который ведет себя точно так же, как и вызов exec (command, envp, null).
Исключение:
1) IndexOutOfBoundsException: если cmd является пустым массивом (имеет длину 0)
2) NullPointerException: если libname равно нулю.
3) SecurityException: если метод checkLink не разрешает загрузку указанной динамической библиотеки.
4) IOException: если возникает ошибка ввода-вывода
// Java-программа для иллюстрации exec ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
// создаем файл с желаемым рабочим каталогом
File f = new File( "/home/saket/Desktop" );
// создаем процесс и выполняем gedit и currect среду
Process process = Runtime.getRuntime().exec( "gedit" , null );
System.out.println( "Gedit opening." );
catch (Exception e)
20) public Process exec (String [] cmdarray, String [] envp, File dir): этот метод выполняет указанную команду и аргументы в отдельном процессе с указанной средой и рабочим каталогом. При наличии массива строк cmdarray, представляющего токены командной строки, и массива строк envp, представляющих настройки переменных «environment», этот метод создает новый процесс, в котором нужно выполнить указанную команду.
Исключение:
1) IndexOutOfBoundsException: если cmd является пустым массивом (имеет длину 0)
2) NullPointerException: если libname равно нулю.
3) SecurityException: если метод checkLink не допускает загрузку указанной библиотеки динамической.
4) IOException: если возникает ошибка ввода-вывода
// Java-программа для иллюстрации exec ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
String[] cmd = new String[ 2 ];
cmd[ 1 ] = "File.java" ;
// создаем файл с желаемым рабочим каталогом
File dir = new File( "/home/saket/Desktop" );
// создаем процесс и выполняем cmdArray
Process process = Runtime.getRuntime().exec(cmd, null , dir);
System.out.println( "File.java opening." );
catch (Exception e)
21) public Process exec (String [] cmdarray, String [] envp): этот метод выполняет указанную команду и аргументы в отдельном процессе с указанной средой. Это удобный метод. Вызов формы exec (cmdarray, envp) ведет себя точно так же, как и вызов exec (cmdarray, envp, null).
Исключение:
1) IndexOutOfBoundsException: если cmd является пустым массивом (имеет длину 0)
2) NullPointerException: если libname равно нулю.
3) SecurityException: если метод checkLink не разрешает загрузку указанной динамической библиотеки.
4) IOException: если возникает ошибка ввода-вывода
// Java-программа для иллюстрации exec ()
// метод класса Runtime
public class GFG
public static void main(String[] args)
String[] cmd = new String[ 2 ];
cmd[ 1 ] = "File.java" ;
// создаем файл с желаемым рабочим каталогом
File dir = new File( "/home/saket/Desktop" );
// создаем процесс и выполняем cmdArray
Process process = Runtime.getRuntime().exec(cmd, null );
System.out.println( "File.java opening." );
catch (Exception e)
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Java предоставляет класс с именем Class в пакете java.lang. Экземпляры класса Class представляют классы и интерфейсы в работающем приложении Java. Примитивные типы Java (логические, байтовые, char, short, int, long, float и double) и ключевое слово void также представлены в виде объектов Class. У него нет публичного конструктора. Объекты класса создаются автоматически виртуальной машиной Java ( JVM ). Это последний класс, поэтому мы не можем его расширять.
Методы класса Class широко используются в Reflection API.
Создание объекта класса
Существует три способа создания объекта Class:
-
Class.forName («className»): Поскольку класс Class не содержит конструктора, в классе Class присутствует статический фабричный метод, который является Class.forName () , используемым для создания объекта класса Class. Ниже приведен синтаксис:
Приведенный выше оператор создает объект Class для класса, переданного в качестве аргумента String (className). Обратите внимание, что параметр className должен быть полностью квалифицированным именем желаемого класса, для которого должен быть создан объект Class. Методы в любом классе в Java, который возвращает тот же объект класса, также известны как фабричные методы. Имя класса, для которого должен быть создан объект Class, определяется во время выполнения.
Обратите внимание, что этот метод используется с именем класса, а не с экземплярами класса. Например
Методы:
-
String toString () : этот метод преобразует объект Class в строку. Он возвращает строковое представление, которое представляет собой строку «class» или «interface», за которой следует пробел, а затем полное имя класса. Если объект Class представляет примитивный тип, то этот метод возвращает имя примитивного типа, а если он представляет void, то возвращает «void».
// Java-программа для демонстрации метода toString ()
public class Test
public static void main(String[] args)
// возвращает объект Class для класса
// с указанным именем
Class c1 = Class.forName( "java.lang.String" );
Class c2 = int . class ;
Class c3 = void . class ;
System.out.print( "Class represented by c1: " );
// метод toString на c1
System.out.print( "Class represented by c2: " );
// метод toString на c2
System.out.print( "Class represented by c3: " );
// метод toString на c3
// Java-программа для демонстрации метода forName ()
public class Test
public static void main(String[] args)
// возвращает объект Class для класса
// с указанным именем
Class c = Class.forName( "java.lang.String" );
System.out.print( "Class represented by c : " + c.toString());
Указанный загрузчик классов используется для загрузки класса или интерфейса. Если для параметра loader задано значение NULL, класс загружается через загрузчик класса начальной загрузки. Класс инициализируется только в том случае, если для параметра initialize задано значение true и он не был инициализирован ранее.
// Java-программа для демонстрации метода forName ()
public class Test
public static void main(String[] args)
// возвращает объект Class для этого класса
Class myClass = Class.forName( "Test" );
ClassLoader loader = myClass.getClassLoader();
// возвращает объект Class для класса
// с указанным именем, используя данный загрузчик классов
Class c = Class.forName( "java.lang.String" , true ,loader);
System.out.print( "Class represented by c : " + c.toString());
// Java-программа для демонстрации метода newInstance ()
public class Test
public static void main(String[] args)
throws ClassNotFoundException, InstantiationException,
// возвращает объект Class для этого класса
Class myClass = Class.forName( "Test" );
// создаем новый экземпляр этого класса
Object obj = myClass.newInstance();
// возвращает класс выполнения obj
System.out.println( "Class of obj : " + obj.getClass());
// Java-программа для демонстрации метода isInstance ()
public class Test
public static void main(String[] args)
// возвращает объект Class для класса
// с указанным именем
Class c = Class.forName( "java.lang.String" );
String s = "GeeksForGeeks" ;
// проверка экземпляра класса
boolean b1 = c.isInstance(s);
boolean b2 = c.isInstance(i);
System.out.println( "is s instance of String : " + b1);
System.out.println( "is i instance of String : " + b1);
// Java-программа для демонстрации метода isAssignableFrom ()
public class Test extends Thread
public static void main(String[] args)
throws ClassNotFoundException, InstantiationException,
// возвращает объект Class для этого класса
Class myClass = Class.forName( "Test" );
// возвращает объект Class для класса
// с указанным именем
Class c1 = Class.forName( "java.lang.Thread" );
Class c2 = Class.forName( "java.lang.String" );
// метод isAssignableFrom на c1
// проверяет, можно ли назначить класс Thread из Test
boolean b1 = c1.isAssignableFrom(myClass);
// метод isAssignableFrom на c2
// проверяет, можно ли назначить класс String из Test
boolean b2 = c2.isAssignableFrom(myClass);
System.out.println( "is Thread class Assignable from Test : " + b1);
System.out.println( "is String class Assignable from Test : " + b2);
// Java-программа для демонстрации метода isInterface ()
public class Test
public static void main(String[] args)
// возвращает объект Class для класса
// с указанным именем
Class c1 = Class.forName( "java.lang.String" );
Class c2 = Class.forName( "java.lang.Runnable" );
// проверка типа интерфейса
// метод isInterface на c1
boolean b1 = c1.isInterface();
// Интерфейсный метод на c2
boolean b2 = c2.isInterface();
System.out.println( "is java.lang.String an interface : " + b1);
System.out.println( "is java.lang.Runnable an interface : " + b2);
// Java-программа для демонстрации метода isPrimitive
public class Test
public static void main(String[] args)
// возвращает объект Class, связанный с целым числом;
Class c1 = int . class ;
// возвращает объект Class, связанный с классом Test
Class c2 = Test. class ;
// проверка типа примитива
// isPrimitive метод на c1
boolean b1 = c1.isPrimitive();
// isPrimitive метод на c2
boolean b2 = c2.isPrimitive();
System.out.println( "is " +c1.toString()+ " primitive : " + b1);
System.out.println( "is " +c2.toString()+ " primitive : " + b2);
// Java-программа для демонстрации метода isArray
public class Test
public static void main(String[] args)
int a[] = new int [ 2 ];
// возвращает объект Class для массива class
Class c1 = a.getClass();
// возвращает объект Class для класса Test
Class c2 = Test. class ;
// проверка типа массива
// метод isArray на c1
boolean b1 = c1.isArray();
// метод Array на c2
boolean b2 = c2.isArray();
System.out.println( "is " +c1.toString()+ " an array : " + b1);
System.out.println( "is " +c2.toString()+ " an array : " + b2);
Ниже приведена Java-программа, объясняющая использование методов isAnonymousClass (), isLocalClass и isMemberClass ().
// Java-программа для демонстрации isAnonymousClass (), isLocalClass
// и метод isMemberClass ()
public class Test
// любой член класса Test
public static void main(String[] args)
// объявляем анонимный класс
Test t1 = new Test()
// определение класса анонимного класса
// возвращает объект Class, связанный с объектом t1
Class c1 = t1.getClass();
// возвращает объект Class, связанный с классом Test
Class c2 = Test. class ;
// возвращает объект Class, связанный с классом A
Class c3 = A. class ;
// проверка на анонимный класс
boolean b1 = c1.isAnonymousClass();
System.out.println( "is " +c1.toString()+ " an anonymous class : " +b1);
// проверка на локальный класс
boolean b2 = c2.isLocalClass();
System.out.println( "is " +c2.toString()+ " a local class : " + b2);
// проверка класса члена
boolean b3 = c3.isMemberClass();
System.out.println( "is " +c3.toString()+ " a member class : " + b3);
// Java-программа для демонстрации метода isEnum ()
public class Test
public static void main(String[] args)
// возвращает объект Class, связанный с Color (перечислимый класс)
Class c1 = Color. class ;
// возвращает объект Class, связанный с классом Test
Class c2 = Test. class ;
// проверка класса Enum
boolean b1 = c1.isEnum();
boolean b2 = c2.isEnum();
System.out.println( "is " +c1.toString()+ " an Enum class : " + b1);
System.out.println( "is " +c2.toString()+ " an Enum class : " + b2);
// Java-программа для демонстрации метода isAnnotation ()
// объявляем тип аннотации
// Аннотации определения элементов
public class Test
public static void main(String[] args)
// возвращает объект Class, связанный с аннотацией A
Class c1 = A. class ;
// возвращает объект Class, связанный с классом Test
Class c2 = Test. class ;
// проверка типа аннотации
boolean b1 = c1.isAnnotation();
boolean b2 = c2.isAnnotation();
System.out.println( "is " +c1.toString()+ " an annotation : " + b1);
System.out.println( "is " +c2.toString()+ " an annotation : " + b2);
// Java-программа для демонстрации метода getName ()
public class Test
public static void main(String[] args)
// возвращает объект Class, связанный с классом Test
Class c = Test. class ;
System.out.print( "Class Name associated with c : " );
// возвращает имя класса
Простое имя массива — это простое имя типа компонента с добавлением «[]». В частности, простое имя массива, тип компонента которого является анонимным, — «[]».
Мы уже говорили о том, что классы — это сложные типы данных. А теперь немного поговорим о второй стороне классов — обработке класса Java-машиной: в Java все является объектом, даже класс. Класс является объектом. Интересно? Тогда продолжим.
Загрузка класса в память
На самом деле, при загрузке класса в память создаются три специальных «объекта»:
Краткое описание картинки
Желтый прямоугольник:
Файл с кодом хранится на диске в виде файла с расширением «.class». Он содержит информацию о классе, его полях и методах, а также код методов, скомпилированный в байт-код.
Оранжевый прямоугольник:
Когда Java-машина загружает класс в память, она компилирует его байт-код в машинный код с учетом процессора компьютера и его операционной системы. Доступ к этому машинному коду есть только у Java-машины: у нас как у Java-программистов его нет.
Зеленый прямоугольник:
Java-машина создает некий объект, который содержит все статические переменные и методы класса. Доступ к этому «объекту» у вас есть по имени класса.
Например, когда вы пишете java.lang. Math . PI , вы обращаетесь к статической переменной PI , которая лежит в классе java.lang.Math . Вот этот java.lang.Math и есть наш зеленый прямоугольник. И именно у него внутри хранится статическая переменная PI .
Синий прямоугольник:
Когда Java-машина загружает код класса в память, она создает специальный объект типа java.lang.Class , в котором хранится информация о загруженном классе: его имя, имена методов, имена и типы полей и т.п.
Название «Class» может немного сбивать столку. Логичнее было бы его назвать ClassInfo: этот класс всего лишь хранит некую информацию о загруженном классе.
Получить объект класса можно у любого типа с помощью команды вида:
Код | Примечание |
---|---|
Получаем объект типа Class с информацией о классе String | |
Получаем объект типа Class с информацией о классе Object | |
Получаем объект типа Class с информацией о классе Integer | |
Получаем объект типа Class с информацией о типе int | |
Получаем объект типа Class с информацией о типе void |
Ссылку на объект с описанием класса можно получить и у объекта: для этого у каждого объекта есть метод getClass() , унаследованный от класса Object .
Читайте также: