У меня следующая проблема:
1) Существует некоторый абстрактный класс A с несколькими анонимными подклассами, хранящимися в статических полях A. Между двумя анонимными подклассами существует циклическая зависимость. Код этого абстрактного класса похож на следующий:
class A implements Serializable
{
public static final A _1 = new A() {
public A foo()
{
return _2;
}
};
public static final A _2 = new A() {
public A foo()
{
return _1;
}
};
public static final A _3 = new A() {
public void bar()
{
// do something
}
};
}
2) На экземпляры класса A ссылаются другие объекты, которые используются в сериализации. Есть некоторые объекты, которые предварительно сериализованы разработчиками и затем включены в выпуск в виде двоичных данных.
После некоторого рефакторинга класса A двоичные имена анонимных подклассов были изменены в сборках выпуска. Я думаю, что это может быть связано с разницей версий компилятора Java. Из файлов .class, созданных на моем компьютере, я вижу, что анонимные подклассы A, хранящиеся в полях _1, _2 и _3, имеют имена A $ 1, A $ 2 и A $ 3 соответственно, но из файлов .class, взятых из сборки выпуска, я вижу, что Анонимные подклассы A, хранящиеся в полях _1, _2 и _3, имеют имена A $ 2, A $ 3 и A $ 1 соответственно. Из-за этого предварительно сериализованные данные стали непригодными для использования, и мне нужно как-то это исправить.
Существуют ли какие-либо спецификации для компиляторов java или JVM, в которых будет указано, какие двоичные имена следует ожидать для моих анонимных классов? В JLS говорится, что именем анонимного класса должно быть имя включающего класса, знак «$» и непустая последовательность цифр без каких-либо ограничений для этих последовательностей.
Я считаю, что мне не следует полагаться на внутренние имена анонимных классов, я также знаю «правильные» способы решения этой проблемы, например, создание предварительно сериализованных данных на сервере сборки. Жаль, что сейчас у нас не так много времени, поэтому я хочу знать, откуда возникает эта разница в именах, чтобы я мог решить эту проблему сейчас.