Какие плюсы и минусы существуют в Java при выборе использования a.getClass()
или A.class
? Любой из них можно использовать везде, где Class<?>
ожидается, но я предполагаю, что использование обоих в разных обстоятельствах принесет производительность или другие незначительные преимущества (как и в случае с Class.forName()
и ClassLoader.loadClass()
.
источник
A.class.getClass()
?Class
объект класса, представляющийA.class
объект, который снова является экземпляромjava.lang.Class
.A.getClass().class
?A
это класс. ДляgetClass
классов нет статического метода.На самом деле они разные в зависимости от того, где вы можете их использовать.
A.class
работает во время компиляции, в то время какa.getClass()
требует экземпляра типаA
и работает во время выполнения.Также может быть разница в производительности. Хотя
A.class
компилятор может разрешить его, поскольку он знает фактический типA
,a.getClass()
это вызов виртуального метода, происходящий во время выполнения.Для справки, целевой байт-код компилятора обычно выдает следующие инструкции для
Integer.getClass()
:и следующее для
Integer.class
:Первый тип обычно включает отправку виртуального метода и, следовательно, предположительно занимает больше времени для выполнения. Однако это в конечном итоге зависит от JVM.
источник
взгляните на примеры ниже
a.getClass()!= A.class
, т.е. a является не экземпляром A, а анонимным подклассом Aa.getClass()
требуется экземпляр типа Aисточник
Используйте,
a.getClass
если у вас есть экземпляр класса / типа и вы хотите получить его точный тип. whilea.class
используется, когда у вас есть вtype
наличии и вы хотите создать его экземпляр.Также
getClass()
возвращает тип экземпляра во время выполнения, пока.class
он оценивается во время компиляции.Учитывая производительность
getClass()
и.class
,.class
имеет лучшую производительность, чемgetClass()
.Пример :
Вывод :
источник
Я хотел бы добавить одно отличие. Допустим, у вас есть класс конструктор, как показано ниже, с суперклассом, который принимает объект класса. Вы хотите, чтобы всякий раз, когда создается объект подкласса, объект класса подкласса должен передаваться суперклассу. Код ниже не будет компилироваться, так как вы не можете вызвать метод экземпляра в конструкторе. В том случае, если вы замените
myObject.getClass()
наMyClass.class
. Он будет работать отлично.источник
Интересно, что различия в производительности, упомянутые в приведенном выше примере, по-видимому, связаны с другими причинами. Используя 3 разных класса, в среднем производительность будет примерно одинаковой:
Результат будет примерно таким:
А переключение порядка звонков даже
getClass()
ускорится.Вывод:
источник
p.getClass()
, гдеp
- экземпляр объекта, возвращает класс среды выполнения этого объектаp
.p
не может быть типом, который вызовет ошибку времени компиляции, он должен быть экземпляром объекта.p.class
это выражение. Это.class
называется синтаксисом класса.p
это тип. Это может быть имя класса, интерфейса или массива и даже примитивный тип.a.getClass() == B.class
.Если тип доступен и есть экземпляр, то можно использовать
getClass
метод для получения имени типа. В противном случае используйте.class
синтаксисисточник