2014-11-10 3 views
0

я делаю инициализацию нового класса с помощью отражения и я поставил один суперкласс поле с «это»:Java отражение: набор супер поле класса во время инициализации

JavaTask jt = (JavaTask) clazz.newInstance(); 
for(Field f : clazz.getSuperclass().asSubclass(JavaTask.class).getDeclaredFields()) { 
    if(f.getType().equals(JavaTaskListener.class)) { 
     logger.trace("Set ReadyListener"); 
     f.setAccessible(true); 
     f.set(jt, this); 
    } 
} 

В таком решении я могу получить доступ к «это» из нового экземпляра jt после завершения инициализации. Можно ли каким-то образом установить jt после создания суперкласса и до создания базового класса, чтобы я мог получить доступ к этому «this» во время инициализации (без добавления нестандартной конструкции)?

public class LocalMotions extends JavaTask { 
    ... 
    private int nb = super.jtListener.getParameter(NUMBER)); 
    ... 
+0

Чтобы подтвердить, что вы хотели бы показать значение 'this' от конструктора до того, как объект hierachy был полностью создан JVM? –

+0

Да. «Это», который является слушателем, очевидно, уже создан. Если это будет объект, созданный суперклассом, я мог бы получить доступ к нему изнутри финального класса во время инициализации. И эта ситуация, которую я думал воспроизвести с размышлением. –

+0

jtListener - это JavaTaskListener –

ответ

1

Публикация ссылки на объект до его полной сборки опасна для JVM и сильно обескуражена.

Когда JSR-133 был в работе, а модель памяти java была выяснена, было указано, что JVM не предоставляет гарантии безопасности потока для ссылок на объект, который просочился во время строительства. То есть становится возможной ссылка на утечку между потоками, которые были выделены, но не обнулено и т. Д.

Для получения более подробной информации исследуйте JSR 133, модель памяти Java и «безопасные строительные технологии». http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#finalRight - хорошая отправная точка.

Смежные вопросы