Подтвердить что ты не робот

Нужен ли нам метод getClass() из java.lang.Object?

Я знаю метод getClass() в java.lang.Object. Но в моем приложении я знаю все мои занятия. Итак, Какова фактическая цель использования этого метода?

4b9b3361

Ответ 1

Вы пробираетесь в чудесный мир Отражение. Используя рефлексию, вы можете программно осматривать классы, устанавливать свои поля, вызывать их методы и т.д. Вы можете сделать с ними действительно мощные вещи и большинство фреймворков, которые вы используете ежедневно (например, Hibernate, Spring, Guice и т.д..) очень сильно зависят от него, чтобы все произошло.

Ответ 2

Но в моем приложении я знаю все мои классы. Итак, Какова фактическая цель использования этого метода?

Итак, если вы пишете это, знаете ли вы, что такое настоящий класс things[0]?

Object[] things = new Object[]{
        "Hi mum", new Integer(42), /* and a whole bunch more */};
shuffle(things);

В теории вы можете выработать класс things[0], используя длинную серию в выражениях instanceof, но это больно. Это решает проблему.

Class cls = things[0].getClass();

Теперь, я дам вам, что вам не часто нужно делать такие вещи. Но когда вы это делаете, функциональность Object.getClass() практически незаменима.

И, как указывают другие ответы, метод getClass() очень важен для приложений, которые используют отражение, чтобы обойти ограничения статической типизации.


Я предполагаю, что другой вопрос заключается в том, влияет ли существование метода Object.getClass() на производительность JVM. Ответ №. Метод только раскрывает информацию, которая должна быть там, чтобы реализовать оператор instanceof. И эта информация обычно используется сборщиком мусора.

Ответ 3

getClass() является общедоступным методом для Object, поэтому он унаследован для всех экземпляров всех классов. Если вы имеете дело с супер-типом какого-либо типа (суперкласс или интерфейс и т.д.), И вы хотите знать класс реализации, getClass() сообщит вам класс любого объекта. Затем вы можете проверить класс, чтобы узнать больше информации.

Простой пример:

public static void doSomething(Object obj) {
    if (obj.getClass().isArray()) {
        System.out.println("It an array");
    } else {
        System.out.println("It not an array");
    }
}

btw, getClass() сам по себе не является частью рефлексии - это простой метод, который возвращает простой (класс) объект. Однако объект класса, возвращенный из getClass(), может использоваться с отражением (см. Пакет java.lang.reflect), чтобы узнать много интересного о классе.

Ответ 4

Вы можете использовать объекты Class для отражения, или вы можете использовать их для других вещей, таких как ключи, в карту для хранения данных о вещах на уровне класса.

Например, у вас может быть класс со статическим состоянием и методами, которые делают такие вещи, как создание экземпляров объектов и сбор статистики. На самом деле у вас может быть несколько таких классов, которые все делают одно и то же, и все, похоже, работают одинаково и, следовательно, имеют возможности для конвергенции. Поскольку класс является статическим, вы, естественно, получили сопоставление от класса к некоторому состоянию и операциям в этом состоянии.

Таким образом, вы можете извлечь общий код из своих статических классов и поместить их в класс, который предоставляет все методы, с добавлением аргумента Class для указания состояния, которое должно использоваться во время следующих операций.

Но в моем приложении я знаю все мои классы. Итак, Какова фактическая цель использования этого метода?

Теперь, когда у вас есть система, которая работает с объектами Class, вы можете предоставить ей объекты, которые у вас нет, такие как сторонние библиотеки, которые вы решили использовать в своем приложении, и вы можете сделать это во время выполнения!

Ответ 5

В JavaDoc говорится:

Возвращаемый объект класса - это объект, который заблокирован методами static synchronized представленного класса.

Это означает, что если ваши классы имеют метод static synchronized, JVM использует getClass() для блокировки метода.

Ответ 6

Иногда нам нужен экземпляр Class для объекта. Подобно тому, как мы программируем против интерфейсов, но нам нужен фактический тип реализации:

List<?> someListImplementation = geListMagically();
System.out.println(someListImplementation.getClass().getName());

Здесь тривиальный пример, почему нам нужно getClass() на java.lang.Object:

Object obj = "A String";
System.out.println(obj.getClass().getName()); // calls Object#getClass()
                                              // and prints java.lang.String :)

Ответ 7

Вы можете использовать для:

  • получить конструкторы класса:
 Constructor[] constructors = this.getClass().getConstructors()
  • получить поля класса (отражение):
   Field[] fields = this.getClass().getFields();
  • используйте его вместо instanceof в методе equals, чтобы перенести контракт симметрии равного метода (как описано здесь)
if (obj == null)
  return false;
if (getClass() != obj.getClass())
  return false;