2016-12-18 14 views
1

Я пытаюсь получить байт-код CGLIB расширение объекта таким образом, используя BCEL:Как получить байт-код экземпляра класса прокси-сервера cglib?

package app; 

import cglib.MyInterceptor; 
import net.sf.cglib.proxy.Enhancer; 
import org.apache.bcel.Repository; 
import org.apache.bcel.classfile.JavaClass; 
import org.apache.bcel.classfile.Method; 
import service.Tool; 

public class CgLibApp { 
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException { 
     // target object 
     Tool tool = new Tool(); 

     // proxying 
     Enhancer e = new Enhancer(); 
     e.setSuperclass(tool.getClass()); 
     e.setCallback(new MyInterceptor(tool)); 
     Tool proxifiedTool = (Tool) e.create(); 

     // trying to get proxy byte code 
     JavaClass clazz = Repository.lookupClass(proxifiedTool.getClass()); 
     Method method = clazz.getMethod(Tool.class.getMethod("meth")); 

     System.out.println(method.getCode().toString()); 
    } 
} 

Но я получаю:

Exception in thread "main" java.lang.ClassNotFoundException: SyntheticRepository could not load service.Tool$$EnhancerByCGLIB$$22a3afcc 
at org.apache.bcel.util.SyntheticRepository.loadClass(SyntheticRepository.java:174) 
at org.apache.bcel.util.SyntheticRepository.loadClass(SyntheticRepository.java:158) 
at org.apache.bcel.Repository.lookupClass(Repository.java:74) 
at app.CgLibApp.main(CgLibApp.java:21) 

Что я должен сделать, чтобы получить байткод от Enhanced объекта?

ответ

0

BCEL запрашивает загрузчик классов для файла .class, чтобы получить массив байтов, который представляет его. Такой файл класса не существует для динамически генерируемого класса.

Чтобы получить файл класса, вам необходимо собрать байт-код во время создания файла класса. Cglib построен поверх ASM и позволяет вам зарегистрировать свой собственный ClassVisitor s для сбора файла класса.

С помощью метода Enhancer используйте метод generateClass(ClassVisitor) и передайте последний метод a ClassWriter. После вызова метода вы можете получить байтовый код из объекта записи класса, который вы передали.