Пользовательская аннотация и динамическая загрузка Java

Я пытаюсь разработать ORM для синхронизации базы данных и решил дать представление Java. У меня есть библиотека, которая определяет синхронную аннотацию, подобную этой

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Inherited public @interface Synchronised { String tableName(); SynchronisationType synchronisationType(); } 

В проекте андроида я использую эту аннотацию для обозначения класса модели

 @Synchronised(tableName="UserAccounts", synchronisationType=SynchronisationType.DownloadOnly) public class UserAccount { @SynchronisedField(fieldName="CompanyFk") private int companyId; @SynchronisedField(fieldName="Id") private int userId; @SynchronisedField(fieldName="Username") private String username; @SynchronisedField(fieldName="Password") private String password; @SynchronisedField(fieldName="Salt") private String salt; @SynchronisedField(fieldName="IsLocked") private boolean isLocked; @SynchronisedField(fieldName="HasMobileAccess") private boolean hasMobileAccess; } 

После некоторого исследования был наконец написан метод «загрузчика», который позволяет обнаруживать классы моделей в текущем apk. Он должен получить все классы, помеченные как «Синхронизированные», но проблема здесь в том, что getAttribute (Synchronised.class) не работает. Ручное повторение аннотаций и поиск атрибута (instanceof и т. Д.) Тоже не работают. При отладке я заметил, что аннотация, исходящая из отражения, на самом деле является прокси (getClass () дает «класс Proxy2», а annotation.AnnotationType () возвращает правильное имя) – это объясняет, почему не удалось выполнить мои предыдущие попытки. При попытке прямого трансляции – брошенное исключение бросается (понятно). В принципе, я здесь в недоумении, поэтому любая идея приветствуется.

Метод загрузки модели (в проекте библиотеки):

 public static List<Class> getModels(Context context, String packageName) throws IOException, URISyntaxException, ClassNotFoundException, NameNotFoundException { String apkName = context.getPackageManager().getApplicationInfo(packageName, 0).sourceDir; DexFile dexFile = new DexFile(apkName); //PathClassLoader classLoader = new PathClassLoader(apkName, ClassLoader.getSystemClassLoader()); PathClassLoader classLoader = new PathClassLoader(apkName, Thread.currentThread().getContextClassLoader()); List<Class> classes = new ArrayList<Class>(); Enumeration<String> entries = dexFile.entries(); while (entries.hasMoreElements()) { String entry = entries.nextElement(); // only check items that exist in source package and not in libraries, etc. if (entry.startsWith(packageName)) { Log.d(TAG, "Entry: " + entry); Class<?> entryClass = classLoader.loadClass(entry);//dexFile.loadClass(entry, classLoader); if (entryClass != null) { Annotation[] annotations = entryClass.getAnnotations(); for (Annotation annotation : annotations) { if (annotation instanceof Synchronised) { classes.add(entryClass); } } } } } return classes; } 

[РЕШЕНИЕ] Загрузчик классов должен быть прикован следующим образом:

 PathClassLoader classLoader2 = new PathClassLoader(apkName, Thread.currentThread().getContextClassLoader()); DexClassLoader classLoader = new DexClassLoader(apkName, new ContextWrapper(context).getCacheDir().getAbsolutePath(), null, classLoader2); 

Если вы до сих пор не знаете, о чем я говорю, спасибо за чтение этой длинной почты (-.

Получите только аннотацию, которое вас интересует:

 Annotation<Synchronised> annotation = entryClass.getAnnotation(Synchronised.class); 

Обновить:

Проблема в том, что DexFile.getClass (), очевидно, возвращает прокси. OP нашел anser и обновил вопрос с помощью решения.