Что такое небезопасное отражение в Java? - PullRequest
0 голосов
/ 21 октября 2019

Мне не удалось найти объяснение «небезопасного отражения» в Java. Я наткнулся на это в сообщении в блоге , в котором упоминается, что GSON использует небезопасное отражение, но не предлагает никаких дополнительных подробностей. Я знаю, что такое отражение. Но что такое «небезопасное» отражение?

Ответы [ 2 ]

1 голос
/ 21 октября 2019

После дополнительных исследований и помощи ссылок, предоставленных другими пользователями в комментариях к исходному сообщению, я думаю, что «небезопасное отражение» означает выделение (то есть создание экземпляра) класса без использования каких-либо его конструкторов. Это сделано отражением. Под «небезопасным» может подразумеваться то, что экземпляр считается безопасным для использования или в безопасном состоянии (конструкции) только после полного выполнения конструкторов. Неслучайно класс, используемый для совершения этого умения, равен sun.misc.Unsafe.

0 голосов
/ 22 октября 2019

Использование фразы «небезопасное отражение», в общем, немного похоже на использование фразы «опасный взрыв» - прилагательное почти избыточно, но мы все еще иногда используем его.

Отражение обходит проверку типов, которую выполняет компилятор. Например, вы можете создать новый экземпляр Class<String>, выполнив что-то вроде (я не проверял это)

Class<String> theStringClass = (Class<String>) Class.forName("java.lang.String")`

, но это несколько небезопасно, потому что, если вы допустили ошибку и получили

Class<String> myStringClass = (Class<String>) Class.forName("java.lang.Sting")`

или

Class<String> myStringClass = (Class<String>) Class.forName("java.lang.Integer")`

вы не получите сообщение об ошибке, пока строка кода не будет запущена. Напротив, если вы сделаете что-то вроде

Class<String> myStringClass = Sting.class

, компилятор сразу выдаст вам ошибку. Таким образом, в качестве общего правила рефлексия небезопасна.

В посте блога "небезопасность" может быть вызвана тем, что GSON делает что-то вроде Article.class.newInstance ()прямого вызова конструктора (и установки значений по умолчанию), но мне это не сразу понятно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...