2015-05-14 6 views
0

У меня есть некоторые методы, которые отражают класс и т.д .:Java Reflection и потокобезопасность

type.getMethods() 
method.getAnnotation(annotationClass) 
method.getParameterTypes() 
method.getParameterAnnotations()[paramIndex]; 
method.getParameterTypes()[paramIndex]; 

Приложение многопоточный. Безопасно ли вызывать эти методы без блокировки?

+1

Проверьте http://stackoverflow.com/questions/5349383/is-java-lang-reflect-method-thread-safe – JonasCz

+0

Он должен сказать в спецификации Java. Если в нем не упоминается безопасность потоков, предположите, что это не так. –

+0

Спасибо. Считаете ли вы, что существует опасность получить разные результаты от разных потоков, которые одновременно называют любой из этих методов? – user2732949

ответ

0

Это безопасно, потому что вы ничего не меняете.

+0

Если мы знаем, что 'foo.get (...)' ничего не изменяет, это не гарантирует, что любой поток t может безопасно вызвать 'foo.get (...)' в любое время. Что произойдет, если какой-нибудь другой поток u называет 'foo.set (...)'? Это может быть «безопасным» или может быть «небезопасным» в зависимости от того, как реализуется класс Foo. –

+0

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

+0

ОК, поэтому причина, по которой эти вызовы методов безопасны, заключается не в том, что эти методы ничего не меняют, а потому что _nothing_ изменяет значения, которые они возвращают. –