Получить байт-код из загруженного класса

Предположим, в моей JVM у меня есть загруженный классClass myClass, Есть линадежный способ попросить JVM длябайткодом содержимое .class? То есть что-то вроде этого:

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

(очевидно,InputStream будет так же хорошо, какbyte[]). Я знаю, что могу использоватьmyClass.getResource() (и друзья), чтобы получить файл класса, но нажимая на имя класса, чтобы получить URL для подачи в getResource, чувствует себя неправильно. Кроме того, я не уверен, как это будет вести себя в случаеC был сгенерирован динамически (например, с использованиемjavax.tools.JavaCompiler).

Любая (лучшая) идея?

примечание: цель состоит в том, чтобы иметь возможность подтолкнутьбайткодом классы для другой JVM и использовать собственный загрузчик классов, чтобы загрузить их там

 ogzd26 июн. 2013 г., 15:16
пожалуйста, посмотрите на:commons.apache.org/proper/commons-bcel
 assylias26 июн. 2013 г., 15:16

Ответы на вопрос(2)

чтобы получить подробный байт-код класса. Пример кода ниже.

     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);
    }
}
Решение Вопроса

цель состоит в том, чтобы иметь возможность загружать байт-код с помощью пользовательского загрузчика классов на другой виртуальной машине Java

Загрузчик классовБезразлично»т просто загрузить байт-код, Поэтому, если вымы возможность получить байт-код из памяти JVM (что теоретически возможно, если вы пишете много собственного, специфичного для реализации кода), он будет бесполезен для вашего удаленного загрузчика классов. Вы должны дать ему актуальный.class файл.

А такжеClass.getResource () это лучший способ выполнить эту задачу. Поскольку он выглядит в том же пакете, что и вызывающий класс, все, что вам нужно сделать, это взять класс ' простое имя, добавить ".учебный класс" и ты'сделано.

Это становится немного сложнее, если у вас есть внутренние или вложенные классы, но этоэто деталь реализации, которую выпридется иметь дело с независимо (если вы нажмете начальный класс, выВсе равно нужно будет тянуть любые зависимые классы).

 CAFxX26 июн. 2013 г., 22:08
извини, мой плохойбайткод» Я действительно имел в видусодержимое файла .class "

Ваш ответ на вопрос