У меня такое ощущение, что это невозможно сделать без специально модифицированной JVM.Вот некоторые подходы ... и почему они не будут работать вообще.
Подход Статический анализ будет работать в простых случаях.Однако что-то вроде этого может поставить в тупик любой инструмент статического анализа текущего поколения:
// Bad design alert ... don't try this at home!
public class LazySingletonStringFactory {
private String s;
public String create(String initial) {
if (s == null) {
s = new String(initial);
}
return s;
}
}
Чтобы статический анализатор выяснил, возвращает ли данный вызов LazySingletonStringFactory.create(...)
только что созданный String
, он должен вычислитьвышло, что это не было вызвано ранее.Проблема остановки говорит нам, что это теоретически невозможно в некоторых случаях, и на практике это выходит за рамки «уровня техники».
Подход IdentityHashCode может работать в однопоточномприложение, которое завершается без запуска сборщика мусора.Однако, если GC запустится, вы получите неправильные ответы.А если у вас несколько потоков, то (в зависимости от JVM) вы можете обнаружить, что объекты размещены в разных «пробелах», что приводит к последовательности создания «id» объекта, которая больше не является монотонной во всех потоках.
Code Instrumentation * Подход 1017 * работает, если вы можете изменить код интересующих вас классов, либо прямые изменения исходного кода, внедрение кода на основе аннотаций, либо путем какой-либо обработки байт-кода.Однако, в общем, вы не можете делать эти вещи для всех классов.
(Мне не известны какие-либо другие подходы, существенно отличающиеся от вышеуказанных трех ... но не стесняйтесь предлагать их в качестве комментария.)