Androidでの動的クラス
SDカードにファイルでクラスを定義する方法です。とりあえずエミュレータで動きました。
まず読み込まれるクラスを含む(ダミーの)アプリケーションを作ります。
そのファイルを/sdcardなどにおきます。(adb pushなど)
その後別のアプリを作って以下のように書きます。
ClassLoader cl = new DexClassLoader("/sdcard/cl/Hello-debug.apk", "/sdcard/cl", (String)null, ClassLoader.getSystemClassLoader());; //この例では/sdcard/clにHello-debug.dexが作成されます。 Class cla = cl.loadClass("sample.hello.HelloA"); //クラス名を指定してロード System.out.println("Class:"+cla); //ここではsample.hello.HelloAにキャストできないのでリフレクションを使う //public void sayHello() を呼ぶためには Method meth = cla.getMethod("sayHello", (Class)null); meth.invoke(cla.newInstance(), (Object)null); //public void say(String) を呼ぶためには meth = cla.getMethod("say", String.class); meth.invoke(cla.newInstance(), new Object[]{"Good night"});
二つのアプリないで、独自に定義するとパッケージ名を含めて同じクラス名前にしても別のクラスと判定されるようでキャストできません。
この使い方をする予定のあるクラスはメソッドに独自に作ったクラスを引数にしない方がよいでしょう。
dexファイルを直接使う方法もあるのでしょうが、普段使わないコマンドが必要になる上に、
試してみても微妙にフォーマットが違うみたいなエラーが出るのでめげました。
apkなら不要なファイルも付きますが、普通のapkを作る手順で作成できます。
ちなみにsample.hello.HelloAはこんな感じ
package sample.hello; public class HelloA implements HelloInt { public void say(String s){ System.out.println("A says "+s+" !!!!!!!!!!!!"); } public void sayHello(){ System.out.println("!!!!!! Hello A !!!!!!!!!!!!"); } }