Я пытаюсь разработать ORM для синхронизации базы данных и решил попробовать отражение в Java. У меня есть библиотека, которая определяет подобную синхронизированную аннотацию
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
public @interface Synchronised {
String tableName();
SynchronisationType synchronisationType();
}
В проекте Android я использую эту аннотацию для обозначения класса модели
@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», а аннотацию. 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;
}
COM PIA для взаимодействия с Office. Но я не боюсь копаться в C ++: P
Я запускаю PowerPoint с помощью PIA следующим образом
var app = new PowerPoint.Application();
var ppt = app.Presentations.Open("my.pptx");
// This line will show a progress dialog
ppt.SaveAs("out.pdf",
PowerPoint.PpSaveAsFileType.ppSaveAsPDF,
MsoTriState.msoTrue);
app.Quit();