studio - como llamar una clase en java
¿Cómo cargar una clase Java dinámicamente en android/dalvik? (1)
Me pregunto si y cómo se pueden cargar dex o archivos de clase dinámicamente en dalvik, alguna función de prueba rápida que escribí fue esta:
public void testLoader() {
InputStream in;
int len;
byte[] data = new byte[2048];
try {
in = context.getAssets().open("f.dex");
len = in.read(data);
in.close();
DexFile d;
Class c = defineClass("net.webvm.FooImpl", data, 0, len);
Foo foo = (Foo)c.newInstance();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
mientras que la interfaz de Foo es esto
public interface Foo {
int get42();
}
y f.dex contiene alguna implementación dx''ed de esa interfaz:
public class FooImpl implements Foo {
public int get42() {
return 42;
}
}
El controlador de prueba anterior arroja defineClass () y no funciona, e investigué el código dalvik y encontré esto:
http://www.google.com/codesearch/p?hl=en#atE6BTe41-M/vm/Jni.c&q=Jni.c ...
Entonces me pregunto si alguien me puede aclarar si esto es posible de alguna otra manera o no se supone que sea posible. Si no es posible, ¿alguien puede explicar por qué esto no es posible?
Hay un example de DexClassLoader en el conjunto de pruebas Dalvik. Accede al cargador de clases de forma reflexiva, pero si compila con el SDK de Android, puede hacer esto:
String jarFile = "path/to/jarfile.jar";
DexClassLoader classLoader = new DexClassLoader(
jarFile, "/tmp", null, getClass().getClassLoader());
Class<?> myClass = classLoader.loadClass("MyClass");
Para que esto funcione, el archivo jar debe contener una entrada llamada classes.dex
. Puede crear un contenedor de este tipo con la herramienta dx
que viene con su SDK.