最初に、実行時にJava-Byte-Codeをロードするのを見てきましたが、現在行き詰まっているのと同じ場所にたどり着くまでに役立ちました。
ファイルをディスクに保存しないように、バイト配列からクラスをロードしようとしています。この例のテスト目的では、.classファイルをバイト配列に読み込んでいるだけなので、ファイルはまだディスクに保存されていますが、コードが機能するかどうかを確認するだけです。
このバイト配列を取得し、メソッドloadClassでカスタムClassLoaderを使用してクラスをロードしますが、機能しません。
byte[] bytearray = null;
try{
RandomAccessFile f = new RandomAccessFile("/sdcard/ClassToGet.dex", "r");
bytearray = new byte[(int) f.length()];
f.read(bytearray);
MyClassLoader classloader = new MyClassLoader();
classloader.setBuffer(bytearray);
classloader.loadClass("com.pack.ClassIWant");
}
ClassLoaderの実装は次のとおりです。
public class MyClassLoader extends DexClassLoader {
private byte[] buffer;
@Override
public Class findClass(String className){
byte[] b = getBuffer();
return this.defineClass(className, b, 0, b.length);
}
public void setBuffer(byte[] b){
buffer = b;
}
public byte[] getBuffer(){
return buffer;
}
そして、私が受け取っているエラーはこれです:
java.lang.UnsupportedOperationException:java.lang.VMClassLoader.defineClass(ネイティブメソッド)でこのタイプのクラスファイルをロードできません
.classファイル、.dexファイル、.apk、.jarなどを提供しました...どの「クラスファイルのタイプ」が必要かわかりません。また、そのドキュメントは存在しません。私がこの仕事を4日間続けてやってきたので、どんな助けも素晴らしいでしょう。