Какая польза от «.class» в Java - PullRequest
0 голосов
/ 24 марта 2020

На самом деле это вопрос из трех частей.

1 Я хочу знать, в каких случаях мы используем ключевое слово class. Очевидно, что мы используем его для определения класса. Но какова цель использования SomeClass.class в выражении?

2 Я читал в Википедии, что его можно использовать вместо выражения new SomeClass().getClass(). Но зачем нам это, когда мы уже можем использовать выражение new SomeClass().getClass()?

3 И когда нам нужно использовать это выражение SomeClass.class в выражении?

Я имею в виду анонимные внутренние классы, и мне пришло в голову, что мы не можем использовать метод getClass() в методе stati c.

Следующий ответ Стивена дает точный уникальный ответ для этой проблемы.

1 Ответ

5 голосов
/ 24 марта 2020

Но какова цель использования SomeClass.class в выражении?

Это называется литералом класса; см. JLS 15.8.2 .

Цель состоит в том, чтобы получить объект Class, который для класса обозначен SomeClass. (Но вы уже знали, что ...)

Но зачем нам это нужно, когда мы уже можем использовать выражение new SomeClass().getClass()?

Поскольку new SomeClass() создает новый экземпляр SomeClass():

  • Это не нужно
  • Это может быть дорого
  • Это может иметь нежелательные побочные эффекты
  • Это может необходимо указать несколько аргументов
  • Это может быть даже невозможно; например, если конструкторы недоступны или класс abstract.

И когда нам нужно использовать это выражение SomeClass.class в выражении?

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


Я имею в виду анонимные внутренние классы

Литерал класса может не может использоваться для получения Class анонимного внутреннего класса. Но this.getClass() будет работать в любом случае 1 метода анонимного класса.

... мне пришло в голову, что мы не можем использовать метод getClass() в stati c method.

Ну, я думаю, это был бы сценарий, где вам нужен литерал класса.

Но, строго говоря, вы можете вызвать getClass() в режиме c. Проблема в том, что вы не можете вызвать его на this, явно или неявно.


1 - я не могу придумать убедительного варианта использования для stati c метод в анонимном классе. Можно было бы ссылаться на такой метод только за пределами анонимного класса, используя отражение. Таким образом, он также может быть объявлен как метод экземпляра.

...