2013-09-27 1 views
2

Я хочу простой в использовании API из cglib или некоторого класса-оболочки для достижения следующего преобразования класса, так что, хотя я использую класс без участия какого-либо прокси.Есть ли простой в использовании API CGLIB для генерации перехватчика методов без использования прокси-сервера?

@Entity 
public class SomeProcess extends SomeProcessBase implements Serializable { 

@ToBeTransformed 
public void start() { 
    //do some business logics 
} 

} 

После класс был преобразован, я ожидаю, что это будет так:

@Entity 
public class SomeProcess extends SomeProcessBase implements Serializable { 

public void start() { 
    Executor.execute(new Executable() { 
     public void execute() { 

      //do some business logics 

     } 
    }); 

} 

} 

Так что пока я хочу вызвать someProcess.start, я могу непосредственно использовать следующий код:

SomeProcess process = new SomeProcess(); 
process.start(); 

кроме

SomeProcess process = new SomeProcess(); 
SomeProcess processProxy = Proxy.wrapper(process); 
processProxy.start(); 

ответ

0

Вы можете использовать javassist http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/tutorial/tutorial.html, чтобы изменить класс на лету. Что-то вроде этого:

ClassPool pool = ClassPool.getDefault(); 
    CtClass sp = pool.get("SomeProcess"); 
    for (CtMethod m : sp.getDeclaredMethods()) { 
     if (m.hasAnnotation(ToBeTransformed.class)) { 
      String body = // create new body 
      m.setBody(body); 
     } 
    } 
+0

Спасибо. Но я хочу, чтобы старое тело было обернуто, старое тело по-прежнему полезно. И я понимаю, что установить закрытый класс не так просто, поскольку после ссылки на параметр они должны быть скопированы во внутренний класс. Я не знаю, как это сделать с джавассистом. –

+0

Согласно вашему ответу, новый вопрос должен быть следующим: Как создать новое тело со старым телом, вложенным в метод внутреннего класса. –

+0

Вы можете переименовать start -> start0, создать новый старт и вызвать start0 из него –