Редактировать: Это работает только для конкретных классов (класс для проверки имеет свой собственный файл .class). Я изменил код ниже, чтобы отразить это. Пока мы не углубимся в библиотеку ClassFileAnalyzer, чтобы работать с классами напрямую, а не читать их из временного файла, это ограничение существует.
У меня работает следующий подход:
Скачать и импортировать следующие библиотеки ClassFileAnalyzer
Добавьте следующие два статических метода (Внимание! GetClussDump () нуждается в небольшой модификации для записи файла класса во временный файл: я удалил свой код здесь, потому что он очень особенный на данный момент):
public static String getClassDump(Class<?> c) throws Exception {
String classFileName = c.getSimpleName() + ".class";
URL resource = c.getResource(classFileName);
if (resource == null) {
throw new RuntimeException("Works only for concreate classes!");
}
String absolutePath = ...; // write to temp file and get absolute path
ClassFile classFile = new ClassFile(absolutePath);
classFile.parse();
Info infos = new Info(classFile, absolutePath);
StringBuffer infoBuffer = infos.getInfos();
return infoBuffer.toString();
}
public static <S extends List<Method>> S sortMethodsBySourceOrder(Class<?> c, S methods) throws Exception {
String classDump = getClassDump(c);
int index = classDump.indexOf("constant_pool_count:");
final String dump = classDump.substring(index);
Collections.sort(methods, new Comparator<Method>() {
public int compare(Method o1, Method o2) {
Integer i1 = Integer.valueOf(dump.indexOf(" " + o1.getName() + lineSeparator));
Integer i2 = Integer.valueOf(dump.indexOf(" " + o2.getName() + lineSeparator));
return i1.compareTo(i2);
}});
return methods;
}
Теперь вы можете вызывать sortMethodsBySourceOrder с любым списком методов (поскольку сортировка массивов не очень удобна), и вы получите список обратно отсортированным.
Он работает, просматривая постоянный пул дампов классов, который, в свою очередь, может быть определен библиотекой.
Greetz,
GHAD