Какая разница между вызовом MyClass.class и MyClass.getClass()
MyClass.class
и MyClass.getClass()
оба возвращают a java.lang.Class
. Есть ли тонкое различие или они могут использоваться взаимозаменяемо? Кроме того, MyClass.class
общедоступное свойство класса superclass Class
? (Я знаю, что это существует, но, похоже, не может найти упоминания об этом в javadocs)
Ответы
Ответ 1
Один из них - это метод экземпляра, поэтому он возвращает класс конкретного объекта, другой - константу класса (т.е. известен во время компиляции).
Class n = Number.class;
Number o = 1;
o.getClass() // returns Integer.class
o = BigDecimal.ZERO;
o.getClass(); // returns BigDecimal.class
Оба случая возвращают экземпляры объекта Class, который описывает конкретный Java-класс. Для того же класса они возвращают один и тот же экземпляр (для каждого класса есть только один объект класса).
Третий способ добраться до объектов класса будет
Class n = Class.forName("java.lang.Number");
Имейте в виду, что интерфейсы также имеют объекты класса (например, Number выше).
Кроме того, является ли MyClass.class общедоступным свойством класса класса суперкласса?
Это ключевое слово для языка.
Ответ 2
.getClass()
возвращает класс среды выполнения объекта, поэтому его можно изменить, если вы измените класс переменной
.class
, с другой стороны, всегда возвращать константу класса "Тип"
Примечание
Если класс времени выполнения будет таким же, как класс TYPE, оба будут равны.
Пример:
Long x = new Long(2);
Class c1 = Long.class;
Class c2 = x.getClass();
//c1==c2
Ответ 3
MyClass не имеет статического метода getClass, другими словами, вы не можете вызвать MyClass.getClass(), вместо этого вам нужно позвонить (новый MyClass()). getClass() для его работы.
getClass() вернет объект MyClass.class. Иными словами, MyClass.class является результирующим объектом, тогда как getClass() является методом. Метод getClass() полезен в случаях, когда вы не знаете фактического класса объекта, например:
public void someMethod(Object o) {
if(o.getClass().equals(Set.class)) {
// The object is a set
} else if(o.getClass().equals(List.class)) {
// The object is a List
}
}
Обратите внимание, что приведенный выше пример кода не самый лучший, я просто пытаюсь показать, как его можно использовать. Такую же функциональность можно достичь с помощью if(o instanceof Set) { ...}
Ответ 4
What the difference between calling MyClass.class and MyClass.getClass()
Прежде всего, ваш заголовок вопроса немного вводит в заблуждение! .getClass() is a method defined in java.lang.Object
, поэтому любой объект в java может вызывать его там, где .class вызывается в самом классе (например, публичные статические переменные). Таким образом, вопрос должен быть (придерживаться соглашений об именах java)
What the difference between calling MyClass.class and myClassObject.getClass()
Теперь к фактическим различиям
.getClass() - это собственный Java-метод в java.lang.Object. Этот метод возвращает объект java.lang.Class, соответствующий runtime class
объекта, на который он вызывается. Так
Test t = new TestSubClass();
Class c2 = t.getClass();
System.out.println(c2);
напечатает class TestSubClass
где в качестве .class будет возвращен статически оцененный (известный во время компиляции) класс. Это фактически объект класса, соответствующий ссылочному типу, указывающему на фактический объект. Так что
Test t = new TestSubClass();
Class c2 = Test.class;
System.out.println(c2);
напечатает class Test