Android ClassLoader

1 resposta
thiagotrss

Boa tarde moçada.

Estou com uma dúvida em relação ao ClassLoader do Android.
Eu queria programaticamente, realizar uma busca por classes no classloader do Android e não
estou conseguindo. A grosso modo, gostaria de fazer um package-scan igual o do sprint pra
reconhecimento dos beans anotados.

Por exemplo… Com o código seguinte, consigo encontrar todas as classes a partir de um pacote
passado por parâmetro na JDK:

public static Class<?>[] getClasses(String packageName) {
		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		assert classLoader != null;
		
		String path = packageName.replace('.', '/');
		Enumeration<URL> resources;
		try {
			resources = classLoader.getResources(path);
			
			List<File> dirs = new ArrayList<File>();
			while (resources.hasMoreElements()) {
			    URL resource = resources.nextElement();
			    dirs.add(new File(resource.getFile()));
			}
			List<Class<?>> classes = new ArrayList<Class<?>>();
			for (File directory : dirs) {
			    try {
					classes.addAll(findClasses(directory, packageName));
				} catch (ClassNotFoundException ignored) {
					ignored.printStackTrace();
				}
			}
			return classes.toArray(new Class[classes.size()]);
		} catch (IOException ignored) {
			ignored.printStackTrace();
		}
		return null;
	}

	private static List<Class<?>> findClasses(File directory, String packageName) throws ClassNotFoundException {
        List<Class<?>> classes = new ArrayList<Class<?>>();
        if (!directory.exists()) {
            return classes;
        }
        File[] files = directory.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                assert !file.getName().contains(".");
                classes.addAll(findClasses(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;
    }

Quando eu executo o método getClasses passando o pacote do meu projeto como parametro,
ele consegue enxergar e me retornar um array com os class encontrados.

No entanto, não funciona se executar no SDK do Android.
Alguem já teve que fazer isso e poderia me dar uma ajuda ?

Valeu.

1 Resposta

thiagotrss

Hoje fui no stackoverflow procurar umas coisas e me deparei com uma pergunta de classloader do android.
Fiquei curioso e fui ler sobre e acabei descobrindo um dos motivos do código acima não funcionar para
o Android.

“This is due to the fact that Android doesn’t use a normal JVM but a DVM. This is a JVM, based on the Apache Harmony
Project and optimized to run on devices with low memory (like Android Phones). This JVM doesn’t use normal Java Byte-Code
(which is in the .class-files) but it’s own Dalvik-Byte-Code which is created by the Android SDK (the tool is dx) when you export your project.”

Não adianta procurar por .class… Vacilo mesmo…

Criado 18 de agosto de 2011
Ultima resposta 23 de ago. de 2011
Respostas 1
Participantes 1