у меня следующая проблема: созданный проект и intellij находит все классы в проекте посредством рефлексии, но при собирании проекта в .jar файл рефлексия перестает работать. Подскажите как решить данную проблему!
Вот весь мой класс:
public class ReflectionUtil {
private static Logger logger = Logger.getLogger(ReflectionUtil.class);
private static ArrayList<Class> classes;
private final static String PACKAGE_INFO = "package-info";
static {
try {
classes = findAllClasses();
for (Class c : classes) {
System.out.println(c.getCanonicalName());
}
} catch (ClassNotFoundException | IOException e) {
throw new RuntimeException("problems with class loading");
}
}
public static Map obtainMap(DBType type, Class clazz) {
for (Class c : classes) {
if (PACKAGE_INFO.equals(c.getSimpleName())) {
Annotation ann = c.getAnnotation(PackageAnnotation.class);
if (ann != null) {
PackageAnnotation annotation = (PackageAnnotation) ann;
if (annotation.type() == type && annotation.clazz() == clazz) {
int lastPoint = c.getName().lastIndexOf(".");
String path = c.getName().substring(0, lastPoint);
try {
return fillMap(path, clazz);
} catch (IllegalAccessException | InstantiationException | NoSuchMethodException | InvocationTargetException e) {
throw new RuntimeException("can't load classes");
}
}
}
}
}
throw new RuntimeException("Loaders or Printers are not found");
}
private static Map fillMap(String path, Class clazz)
throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
List<Class> packClasses = new ArrayList<>();
for (Class c : classes) {
String className = c.getName();
if (className.startsWith(path)) {
packClasses.add(c);
}
}
Map map = new HashMap();
for (Class c : packClasses) {
Annotation a = c.getAnnotation(clazz);
if (a != null) {
Class<?> type = a.annotationType();
Method m = type.getMethod("element");
String[] keys = (String[]) m.invoke(a);
Object value = c.newInstance();
for (String k : keys) {
map.put(k, value);
}
}
}
return map;
}
private static ArrayList<Class> findAllClasses() throws ClassNotFoundException, IOException {
String pack = ReflectionUtil.class.getPackage().getName();
String[] directories = pack.split("\\.");
String path = directories[0];
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
assert classLoader != null;
Enumeration<URL> resources = classLoader.getResources(path);
List<File> dirs = new ArrayList<>();
while (resources.hasMoreElements()) {
String path2 = resources.nextElement().getPath();
File directory = new File(URLDecoder.decode(path2, "UTF-8"));
dirs.add(directory);
}
ArrayList<Class> classes = new ArrayList<>();
for (File directory : dirs) {
classes.addAll(findClassesInDirectory(directory, path));
}
return classes;
}
private static List<Class> findClassesInDirectory(File directory, String packageName) throws ClassNotFoundException {
List<Class> classes = new ArrayList<>();
if (!directory.exists()) {
return classes;
}
File[] files = directory.listFiles();
assert files != null;
for (File file : files) {
if (file.isDirectory()) {
assert !file.getName().contains(".");
classes.addAll(findClassesInDirectory(file, packageName + "." + file.getName()));
} else if (file.getName().endsWith(".class")) {
classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
}
}
return classes;
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Пожалуйста, объясните как можно используя каждый из этих способов извлекать ключК пример есть:
Задача учебная на javaВ ней есть объект, который выглядит как круг и двигается за целью (типа игра)
Как через кнопку в уведомлении вызвать метод processIntent() в MainActivityВ уведомлении я прописал кнопки
В простое веб приложение подключил log4j