1 - Отражение (как концепция) действительно ортогонально безопасности / безопасности.
В дизайне java большое внимание уделялось дизайну java, чтобы сделать его безопасной платформой со статической типизацией, менеджером безопасности, дисциплинированное использование загрузчика классов, а также отсутствие возможности наведения указателей / памяти. Вы можете прочитать интервью Джеймса Гослинга в Учреждениях программирования , что интересно об этом.
Но чем больше отражающей способности, тем сложнее обеспечить безопасность вещей, как им следует. Отражение поражает, в частности, статическую типизацию и может привести к ошибкам во время выполнения.
Но возможны и более тонкие вещи. Например, загрузчики классов, которые можно рассматривать как рефлексивный крючок в системе, были неправильно разработаны в ранней версии Java, что привело к потенциальной замене типа. Статья Загрузка динамического класса в JVM, Гиладом Брахой, проницательна по таким вопросам.
Отражение нельзя полностью отключить; всегда можно задуматься о своих собственных общественных полях / методах. Однако отражение в частных структурах с AccessibleObject.setAccessible
может быть отключено, поскольку оно прерывает инкапсуляцию. Доступ к закрытым полям и т. Д. Возможен осмотр и изменение внутренних данных. Это может привести к различным вредоносным атакам, например.
строки
больше не являются неизменяемыми и могут быть изменены (см. этот вопрос ) Наконец, есть другой механизм, который ставит под угрозу безопасность, особенно sun. misc.Unsafe
, который дает прямой доступ к указателям памяти.
2 - Теперь вопрос заключается в том, приведет ли отражение (на практике) к множеству рисков.
Я прочитал ссылку, указанную @dbyrne но это в основном около .net. Также я точно не знаю, что отключено для приложения Google. Это только ReflectPermission или другое разрешение диспетчера безопасности? Одна опасность заключается в том, чтобы получить доступ к файловой системе и беспорядок.
Проблема доступа к конфиденциальным данным и прерывания инкапсуляции может быть доказана на практике. Написание защищенного кода действительно чрезвычайно сложно, и даже без изменения модификатора доступа вы можете подклассифицировать классы неприемлемым образом - если они не являются final
или даже лучше, закрыты - и передают их. Это, например, то, что защитное копирование пытается защитить.
Тип-безопасность также в любом случае угрожает ошибкой во время выполнения из-за downcast, поэтому этот аргумент также может быть аргументирован.
В общей / размещенной среде безопасность относительна. На уровне языка вы можете, например, не мешать модульной форме, потребляющей 100% процессора, или потребляющей всю память до OutOfMemoryException
.
Таким образом, мой личный ответ был бы следующим: отражение - это риск безопасности, но не такой большой в по сравнению с другими потенциальными атакующими векторами.
Возможно, вы хотите ifelse
:
a <- c(1,1,1,1,0,0,0,0,2,2)
ifelse(a>0,a/sum(a),1)
[1] 0.125 0.125 0.125 0.125 1.000 1.000 1.000 1.000
[9] 0.250 0.250
Просто добавив точку в целом дискуссию о том, почему это предупреждение появляется (раньше мне это не было ясно). Причина, по которой это делается, как упоминалось ранее, заключается в том, что «a» в этом случае является вектором, а неравенство «a> 0» создает другой вектор TRUE и FALSE (где «a» -> 0 или нет).
Если вы хотите вместо этого проверить, есть ли какое-либо значение 'a> 0', вы можете использовать функции - «any» или «all»
Best
if
оператор не векторизован. Для векторизованных операторов if вы должны использовать ifelse
. В вашем случае достаточно написать
w <- function(a){
if (any(a>0)){
a/sum(a)
}
else 1
}
или короткую векторную версию
ifelse(a > 0, a/sum(a), 1)
. Это зависит от того, что вы хотите использовать, потому что первая функция дает выходной вектор длина 1 (в остальной части) и ifelse
дает выходной вектор длины, равный длине a
.
Как я решал этот вопрос, когда я пытался сделать что-то подобное, когда я определял функцию, и он вызывался с массивом, как другие указывали
. Вы могли бы сделать что-то вроде этого, однако для эти сценарии менее элегантны по сравнению с методом Свена.
sapply(a, function(x) afunc(x))
afunc<-function(a){
if (a>0){
a/sum(a)
}
else 1
}
Вот простой способ без ifelse
:
(a/sum(a))^(a>0)
Пример:
a <- c(0, 1, 0, 0, 1, 1, 0, 1)
(a/sum(a))^(a>0)
[1] 1.00 0.25 1.00 1.00 0.25 0.25 1.00 0.25
ifelse
примерно в 7 раз (на массиве элементов 100000).
– Matthew Lundberg
5 January 2013 в 16:24
^
(например, то, что он назвал и как он работает). Предпочтительно что-то более прямое, чем документация арифметических операторов ...
– theforestecologist
13 November 2017 в 03:35
^
используется для возведения в степень. Команда x ^ y
означает: x
поднята до значения y
. Код 2 ^ 3
будет вычислять 2 * 2 * 2
.
– Sven Hohenstein
13 November 2017 в 21:19