14

JVM にクラスがロードされているとしClass<C> myClassます。JVMに要求する信頼できる方法はありますかバイトコード.class? の内容 つまり、次のようなものです。

<C> byte[] getClassBytecode(Class<C> myClass) {
    return /* the contents of the .class resource where C was loaded from */;
}

(明らかに、InputStreamは と同じくらい良いでしょうbyte[])。クラス ファイルを取得するために (および友人を)使用できることはわかっていmyClass.getResource()ますが、getResource にフィードする URL を取得するためにクラス名を叩くのは間違っていると感じます。Cまた、動的に生成された場合 (例: を使用) にこれがどのように動作するかはわかりませんjavax.tools.JavaCompiler

(より良い)アイデアはありますか?

注: 目標は、バイトコードクラスを別の JVM にロードし、カスタム クラスローダーを使用してそこにロードします。

4

2 に答える 2

11

注: 目標は、別の JVM でカスタム クラスローダーを使用してバイトコードをロードできるようにすることです。

クラスローダはバイトコードをロードするだけではありません。したがって、 JVM メモリからバイトコードを取得できとしても (実装固有のネイティブ コードを大量に記述した場合、理論的には可能です)、リモート クラスローダにとっては役に立たないでしょう。実際のファイルを指定する必要があり.classます。

Class.getResource()は、このタスクを達成するための最良の方法です。呼び出し元のクラスと同じパッケージにあるように見えるため、クラスの単純な名前を取得し、「.class」を追加するだけで完了です。

内部クラスまたはネストされたクラスがある場合は少し難しくなりますが、それは実装の詳細であり、関係なく対処する必要があります (初期クラスをプッシュする場合は、依存クラスをプルする必要があります)。

于 2013-06-26T14:20:58.293 に答える
4

ASM ライブラリを使用して、クラスの詳細バイトコードを取得できます。サンプルコードを以下に示します。

     public class AAA extends ClassLoader{
       public static void main(){
        String resource = caller.replace('.', '/')+".class";
        InputStream is = getResourceAsStream(resource);
        ClassReader cr = new ClassReader(is);
        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);

        ClassVisitor visitor = new BCMerge(Opcodes.ASM5, cw, callee);
        cr.accept(visitor, 0);
    }
  }
  class BCMerge extends ClassVisitor{
         public MethodVisitor visitMethod(int access, String name, String desc,String signature, String[] exceptions) {
        System.out.println(name);
        if (cv != null) {
            return new MyMethodVisit(cv.visitMethod(access, name, desc, signature, exceptions));
        }
        return null;
    }
   }

public class MyMethodVisit extends MethodVisitor{
    @Override
    public void visitMethodInsn(int opcode, String owner, String name,
            String desc, boolean itf) {
            System.out.println("opcode:" + opcode + " owner:" + owner + " name:"+ name + " desc:" + desc);
            return super.visitMethodInsn(opcode, owner, name, desc, itf);
    }
}
于 2015-04-23T20:58:33.947 に答える