/* * Copyright 2008 biaoping.yin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.frameworkset.spi.cglib; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import net.sf.cglib.proxy.NoOp; import org.apache.log4j.Logger; import org.frameworkset.spi.CallContext; import org.frameworkset.spi.assemble.BaseTXManager; import org.frameworkset.spi.assemble.Pro; import org.frameworkset.spi.assemble.ProviderInfoQueue; import org.frameworkset.spi.assemble.ProviderManagerInfo; import org.frameworkset.spi.assemble.SecurityProviderInfo; import org.frameworkset.spi.assemble.SynchronizedMethod; import org.frameworkset.spi.async.AsyncCall; import org.frameworkset.spi.async.CallBack; import org.frameworkset.spi.async.CallBackService; import org.frameworkset.spi.async.CallBackServiceImpl; import org.frameworkset.spi.async.CallService; import org.frameworkset.spi.interceptor.AfterThrowable; import com.frameworkset.proxy.Interceptor; /** * <p>Title: CGLibUtil.java</p> * <p>Description: </p> * <p>bboss workgroup</p> * <p>Copyright (c) 2007</p> * @Date 2010-6-19 下午06:00:28 * @author biaoping.yin * @version 1.0 */ public class CGLibUtil { private static Logger log = Logger.getLogger(CGLibUtil.class); private static AsyncCall asyncCall; private static Object lock = new Object(); private static void init() { if(asyncCall != null ) return; synchronized(lock) { if(asyncCall == null ) { asyncCall = new AsyncCall(); asyncCall.start(); } } } public static Object invoke(final Object delegate, final Method method, final Object[] args, final MethodProxy proxy,final CallContext callcontext,final BaseTXManager providerManagerInfo) throws Throwable { final SynchronizedMethod synmethod = providerManagerInfo.isAsyncMethod(method,null) ; if(synmethod == null ) { return invoke_(delegate, method, args, proxy,callcontext,providerManagerInfo) ; } else { // if(synmethod.getAsyncResultMode() == Result.YES // && synmethod.getAsyncCallback() == null // && synmethod.getAsyncTimeout() <= 0 ) // { // return invoke_(delegate, method, args, // proxy,callcontext,serviceID,providerManagerInfo) ; // } init(); return asyncCall.runCallService(new CallService(){ public SynchronizedMethod getAsyncMethod() { return synmethod; } public CallBackService getCallBackService() { if(callcontext != null && callcontext.getApplicationContext() != null && synmethod.getAsyncCallback() != null) { CallBack callBack = (CallBack)callcontext.getApplicationContext().getBeanObject(synmethod.getAsyncCallback()); return new CallBackServiceImpl(callBack); } return null; } public Object call() throws Exception { try { return invoke_(delegate, method, args, proxy,callcontext,providerManagerInfo); } catch (Exception e) { throw e; } catch (Throwable e) { throw new Exception(e); } } }); } } public static Object invoke(final Object delegate, final Method method, final Object[] args, final MethodProxy proxy,final Pro providerManagerInfo) throws Throwable { final SynchronizedMethod synmethod = providerManagerInfo.isAsyncMethod(method,null) ; if(synmethod == null ) { return invoke_(delegate, method, args, proxy,providerManagerInfo) ; } else { // if(synmethod.getAsyncResultMode() == Result.YES // && synmethod.getAsyncCallback() == null // && synmethod.getAsyncTimeout() <= 0 ) // { // return invoke_(delegate, method, args, // proxy,callcontext,serviceID,providerManagerInfo) ; // } init(); return asyncCall.runCallService(new CallService(){ public SynchronizedMethod getAsyncMethod() { return synmethod; } public CallBackService getCallBackService() { if(providerManagerInfo.getApplicationContext() != null && synmethod.getAsyncCallback() != null) { CallBack callBack = (CallBack)providerManagerInfo.getApplicationContext().getBeanObject(synmethod.getAsyncCallback()); return new CallBackServiceImpl(callBack); } return null; } public Object call() throws Exception { try { return invoke_(delegate, method, args, proxy,providerManagerInfo); } catch (Exception e) { throw e; } catch (Throwable e) { throw new Exception(e); } } }); } } private static Object invoke_(Object delegate, Method method, Object[] args, MethodProxy proxy,CallContext callcontext,BaseTXManager providerManagerInfo) throws Throwable { // if (!serviceID.isRemote()) { Interceptor txinterceptor = null; String muuid = null; if(providerManagerInfo.enableTransaction()) { muuid = SynchronizedMethod.buildMethodUUID(method); txinterceptor = providerManagerInfo.getTransactionInterceptor(method,muuid); } Interceptor interceptor = null; if(providerManagerInfo.enableInterceptor()) { if(muuid == null) muuid = SynchronizedMethod.buildMethodUUID(method); interceptor = providerManagerInfo.getChainInterceptor(method,muuid); } Object obj = null;// 只返回delegate中方法返回的值 try { if (interceptor != null) interceptor.before(method, args); } catch(Exception e) { throw e; } // catch(Exception e) // { // log.info("",e); // } try { // 如果不是同步方法,则无需同步调用其他接口方法 // log.debug("method.getName():" + method.getName()); //log.debug("providerManagerInfo.getSynchronizedMethod(" // + // method.getName() + "):" + // providerManagerInfo.getSynchronizedMethod // (method.getName())); if(txinterceptor == null) { obj = untxinvoke_(delegate, method, args, proxy,providerManagerInfo); } else { obj = txinvoke_(delegate, method, args, proxy,providerManagerInfo,txinterceptor ); } if (interceptor != null) try { interceptor.after(method, args); } catch (Throwable e) { throw new AfterThrowable(e); } return obj; } catch(AfterThrowable e) { throw e.getCause(); } catch (InvocationTargetException e) { if (interceptor != null) { interceptor.afterThrowing(method, args, e.getTargetException()); } // 将方法抛出的异常直接抛出方法异常 throw e.getTargetException(); } catch (Throwable t) { // t.printStackTrace(); if (interceptor != null) interceptor.afterThrowing(method, args, t); throw t; } finally { if (interceptor != null) { interceptor.afterFinally(method, args); interceptor = null; } } } // else // { // // return RPCHelper.getRPCHelper().rpcService((RemoteServiceID)serviceID, method, args,callcontext); // // } } private static Object txinvoke_(Object delegate, Method method, Object[] args, MethodProxy proxy,BaseTXManager providerManagerInfo,Interceptor tx ) throws Throwable { Object obj = null; try { tx.before(method, args); if(proxy == null) obj = method.invoke(delegate, args); else obj = method.invoke(delegate, args); tx.after(method, args); return obj; } catch (InvocationTargetException e) { tx.afterThrowing(method, args, e.getTargetException()); throw e; } catch(Throwable e) { tx.afterThrowing(method, args, e); throw e; } finally { tx.afterFinally(method, args); } } private static Object untxinvoke_(Object delegate, Method method, Object[] args, MethodProxy proxy,BaseTXManager providerManagerInfo) throws Throwable { Object obj = null; // Interceptor tx = providerManagerInfo.getTransactionInterceptor(method); try { if(proxy == null) obj = method.invoke(delegate, args); else obj = method.invoke(delegate, args); return obj; } catch(Throwable e) { throw e; } finally { } } private static Object invoke_(Object delegate, Method method, Object[] args, MethodProxy proxy,BaseTXManager providerManagerInfo) throws Throwable { // if (!serviceID.isRemote()) // try { // Interceptor txinterceptor = providerManagerInfo.getTransactionInterceptor(method); // Interceptor interceptor = providerManagerInfo.getInterceptorChain(); Interceptor txinterceptor = null; String muuid = null; if(providerManagerInfo.enableTransaction()) { muuid = SynchronizedMethod.buildMethodUUID(method); txinterceptor = providerManagerInfo.getTransactionInterceptor(method,muuid); } Interceptor interceptor = null; if(providerManagerInfo.enableInterceptor()) { if(muuid == null) muuid = SynchronizedMethod.buildMethodUUID(method); interceptor = providerManagerInfo.getChainInterceptor(method,muuid); } Object obj = null;// 只返回delegate中方法返回的值 try { if (interceptor != null) interceptor.before(method, args); } catch(Exception e) { throw e; } // catch(Exception e) // { // log.info("",e); // } try { // 如果不是同步方法,则无需同步调用其他接口方法 // log.debug("method.getName():" + method.getName()); //log.debug("providerManagerInfo.getSynchronizedMethod(" // + // method.getName() + "):" + // providerManagerInfo.getSynchronizedMethod // (method.getName())); if(txinterceptor != null) { obj = txinvoke_( delegate, method, args, proxy, providerManagerInfo,txinterceptor ); } else { obj = untxinvoke_( delegate, method, args, proxy, providerManagerInfo); } if (interceptor != null) try { interceptor.after(method, args); } catch (Throwable e) { throw new AfterThrowable(e); } return obj; } catch(AfterThrowable e) { throw e.getCause(); } catch (InvocationTargetException e) { //log.error(e); if (interceptor != null) { interceptor.afterThrowing(method, args, e.getTargetException()); } // 将方法抛出的异常直接抛出方法异常 throw e.getTargetException(); } catch (Throwable t) { if (interceptor != null) interceptor.afterThrowing(method, args, t); throw t; } finally { if (interceptor != null) { interceptor.afterFinally(method, args); interceptor = null; } } } // finally // { // // } } public static Object invokeSynTX(final Object delegate, final Method method, final Object[] args, final MethodProxy proxy,final CallContext callcontext,final ProviderManagerInfo providerManagerInfo) throws Throwable { final SynchronizedMethod synmethod = providerManagerInfo.isAsyncMethod(method,null) ; if(synmethod == null ) { return invokeSynTX_(delegate, method, args, proxy,callcontext,providerManagerInfo) ; } else { // if(synmethod.getAsyncResultMode() == Result.YES // && synmethod.getAsyncCallback() == null // && synmethod.getAsyncTimeout() <= 0 ) // { // return invokeSynTX_(delegate, method, args, // proxy,callcontext,serviceID,providerManagerInfo) ; // } init(); return asyncCall.runCallService(new CallService(){ public SynchronizedMethod getAsyncMethod() { return synmethod; } public CallBackService getCallBackService() { if(callcontext != null && callcontext.getApplicationContext() != null) { CallBack callBack = (CallBack)callcontext.getApplicationContext().getBeanObject(synmethod.getAsyncCallback()); return new CallBackServiceImpl(callBack); } return null; } public Object call() throws Exception { try { return invokeSynTX_(delegate, method, args, proxy,callcontext,providerManagerInfo) ; } catch (Exception e) { throw e; } catch (Throwable e) { throw new Exception(e); } } }); } } private static Object invokeSynTX_(Object delegate, Method method, Object[] args, MethodProxy proxy,CallContext callcontext,ProviderManagerInfo providerManagerInfo) throws Throwable { // if (!serviceID.isRemote()) { String uuid = SynchronizedMethod.buildMethodUUID(method); Interceptor interceptor = providerManagerInfo.getSynTransactionInterceptor(method,uuid); try { Object obj = null;// 只返回delegate中方法返回的值 // 如果不是同步方法,则无需同步调用其他接口方法 // log.debug("method.getName():" + method.getName()); //log.debug("providerManagerInfo.getSynchronizedMethod(" // + // method.getName() + "):" + // providerManagerInfo.getSynchronizedMethod // (method.getName())); if (!providerManagerInfo.isSynchronizedEnabled() || !providerManagerInfo.isSynchronizedMethod(method)) {// 如果没有配置以方法及相应的方法参数的为标识的同步方法 // , // 如果有则执行所有provider的同步方法 if (interceptor != null) interceptor.before(method, args); if(proxy == null) obj = method.invoke(delegate, args); else obj = method.invoke(delegate, args); if (interceptor != null) interceptor.after(method, args); return obj; } else { // 获取服务提供者队列,该队列已经按照指定的优先级顺序进行排序 ProviderInfoQueue providerInfoQueue = providerManagerInfo.getProviderInfoQueue(); //同步调用所有的接口方法,如果同步方法是是事务性方法,则需要进行事务处理,及要么全部成功,要么全部失败 // 否则在处理的过程中,一些服务提供者方法被执行时抛出异常,将继续执行后续的同步方法 SynchronizedMethod synm = providerManagerInfo.isTransactionMethod(method,uuid); boolean isTXMethod = synm != null; Throwable throwable = null; if (interceptor != null) interceptor.before(method, args); for (int i = 0; i < providerInfoQueue.size(); i++) { SecurityProviderInfo securityProviderInfo = providerInfoQueue .getSecurityProviderInfo(i); if (!securityProviderInfo.isUsed() && !securityProviderInfo.isIsdefault()) { continue; } Object provider = securityProviderInfo.getProvider(callcontext); // Object provider = // !providerManagerInfo.isSinglable() ? // securityProviderInfo // .getProvider(parent) : // securityProviderInfo.getSingleProvider // (parent); boolean isdelegate = provider.getClass() == delegate.getClass(); // 缺省的provider和被标识为使用的provider都需要进行同步调用 if (isdelegate || securityProviderInfo.isUsed() || securityProviderInfo.isIsdefault()) { if (isdelegate && !securityProviderInfo.isUsed()) { log.warn("调用的Provider[" + delegate.getClass() + "],[" + securityProviderInfo + "]被设置为未使用的服务提供者。"); } if (!isTXMethod) // 不是事务方法时, // 执行所有的provider的同一个方法, // 忽略失败的方法调用, { /** * 缺省的提供者,也就是默认的提供者,不需要进行事务处理时, * 只保留服务提供者的返回值 */ if (isdelegate) { try { method = provider.getClass().getMethod(method.getName(), method.getParameterTypes()); if(proxy == null) obj = method.invoke(provider, args); else obj = method.invoke(provider, args); } catch (InvocationTargetException e) { throwable = e.getTargetException(); log.error("调用服务提供者[" + securityProviderInfo + "]中方法[" + method + "]异常:" + e.getMessage(), e); } catch (Exception e) { throwable = e; log.error("调用服务提供者[" + securityProviderInfo + "]中方法[" + method + "]异常:" + e.getMessage(), e); } } else { try { method = provider.getClass().getMethod(method.getName(), method.getParameterTypes()); method.invoke(provider, args); } catch (Exception e)// 抛出异常时不记录该异常, // 继续执行后续的provider的方法 { // 不是事务方法调用时,忽略其他服务提供者方法执行时的异常 log.error("同步调用服务提供者[" + securityProviderInfo + "]中方法[" + method + "]异常:" + e.getMessage(), e); } } // 抛出缺省服务提供者方法异常,同时终止其他provider同步执行逻辑 } else // 事务性方法执行逻辑,不处理事务性异常,但是需要处理非事务性异常 { if (isdelegate) { try { method = provider.getClass().getMethod(method.getName(), method.getParameterTypes()); if(proxy == null) obj = method.invoke(provider, args); else obj = method.invoke(provider, args); } catch (InvocationTargetException e) { if (synm.isRollbackException(e.getTargetException())) // 事务性异常 // , // 继续抛出异常 // , // 中断其他服务提供者方法执行 { throw e.getTargetException(); } else { throwable = e.getTargetException();// 抛出异常时记录该异常 // , // 继续执行后续的provider的同步方法 } } catch (Exception e) { if (synm.isRollbackException(e)) // 事务性异常 // , // 继续抛出异常 // , // 中断其他服务提供者方法执行 { throw e; } else { throwable = e;// 抛出异常时记录该异常, // 继续执行后续的provider的同步方法 } } } else { try { method = provider.getClass().getMethod(method.getName(), method.getParameterTypes()); method.invoke(provider, args); } catch (InvocationTargetException e) { if (synm.isRollbackException(e.getTargetException())) // 事务性异常 // , // 继续抛出异常 // , // 中断其他服务提供者方法执行 { throw e; } else { log.error("同步调用服务提供者[" + securityProviderInfo + "]中方法[" + method + "]异常:" + e.getMessage(), e); } } catch (Exception e) { if (synm.isRollbackException(e)) // 事务性异常 // , // 继续抛出异常 // , // 中断其他服务提供者方法执行 { throw e; } else { log.error("同步调用服务提供者[" + securityProviderInfo + "]中方法[" + method + "]异常:" + e.getMessage(), e); } } } } } // log.debug( // "providerInfoQueue.getSecurityProviderInfo("+ // i // +").getProvider()" + // providerInfoQueue.getSecurityProviderInfo(i) // .getProvider()); } if (throwable != null)// 如果在方法的执行过程中发生异常,抛出该异常 throw throwable; if (interceptor != null) interceptor.after(method, args); return obj; } } catch (InvocationTargetException e) { if (interceptor != null) { try { interceptor.afterThrowing(method, args, e.getTargetException()); } catch (Exception ei) { ei.printStackTrace(); } } throw e.getTargetException(); } catch (Throwable t) { try { t.printStackTrace(); if (interceptor != null) interceptor.afterThrowing(method, args, t); } catch (Exception e) { e.printStackTrace(); } throw t; } finally { try { if (interceptor != null) interceptor.afterFinally(method, args); } catch (Exception e) { e.printStackTrace(); } interceptor = null; } } // else // { // return RPCHelper.getRPCHelper().rpcService((RemoteServiceID)serviceID, method, args,callcontext); // } } public static Object invokeSyn(final Object delegate, final Method method, final Object[] args, final MethodProxy proxy,final CallContext callcontext,final ProviderManagerInfo providerManagerInfo) throws Throwable{ final SynchronizedMethod synmethod = providerManagerInfo.isAsyncMethod(method,null) ; if(synmethod == null ) { return invokeSyn_(delegate, method, args, proxy,callcontext,providerManagerInfo); } else { // if(synmethod.getAsyncResultMode() == Result.YES // && synmethod.getAsyncCallback() == null // && synmethod.getAsyncTimeout() <= 0 ) // { // return invokeSyn_(delegate, method, args, // proxy,callcontext,serviceID,providerManagerInfo); // } init(); return asyncCall.runCallService(new CallService(){ public SynchronizedMethod getAsyncMethod() { return synmethod; } public CallBackService getCallBackService() { if(callcontext != null && callcontext.getApplicationContext() != null) { CallBack callBack = (CallBack)callcontext.getApplicationContext().getBeanObject(synmethod.getAsyncCallback()); return new CallBackServiceImpl(callBack); } return null; } public Object call() throws Exception { try { return invokeSyn_(delegate, method, args, proxy,callcontext,providerManagerInfo); } catch (Exception e) { throw e; } catch (Throwable e) { throw new Exception(e); } } }); } } private static Object invokeSyn_(Object delegate, Method method, Object[] args, MethodProxy proxy,CallContext callcontext,ProviderManagerInfo providerManagerInfo) throws Throwable { // if (!serviceID.isRemote()) { Interceptor interceptor = providerManagerInfo.getSynTransactionInterceptor(method,null); try { Object obj = null;// 只返回delegate中方法返回的值 // 如果不是同步方法,则无需同步调用其他接口方法 // log.debug("method.getName():" + method.getName()); //log.debug("providerManagerInfo.getSynchronizedMethod(" // + // method.getName() + "):" + // providerManagerInfo.getSynchronizedMethod // (method.getName())); if (!providerManagerInfo.isSynchronizedEnabled() || !providerManagerInfo.isSynchronizedMethod(method)) {// 如果没有配置以方法及相应的方法参数的为标识的同步方法 // , // 如果有则执行所有provider的同步方法 // method = delegate.getClass().getMethod(method.getName(), method.getParameterTypes()); if (interceptor != null) interceptor.before(method, args); if(proxy == null) obj = method.invoke(delegate, args); else obj = method.invoke(delegate, args); if (interceptor != null) interceptor.after(method, args); return obj; } else { // 获取服务提供者队列,该队列已经按照指定的优先级顺序进行排序 ProviderInfoQueue providerInfoQueue = providerManagerInfo.getProviderInfoQueue(); //同步调用所有的接口方法,如果同步方法是是事务性方法,则需要进行事务处理,及要么全部成功,要么全部失败 // 否则在处理的过程中,一些服务提供者方法被执行时抛出异常,将继续执行后续的同步方法 Throwable throwable = null; if (interceptor != null) interceptor.before(method, args); for (int i = 0; i < providerInfoQueue.size(); i++) { SecurityProviderInfo securityProviderInfo = providerInfoQueue .getSecurityProviderInfo(i); if (!securityProviderInfo.isUsed() && !securityProviderInfo.isIsdefault()) { continue; } // Object provider = // !providerManagerInfo.isSinglable() ? // securityProviderInfo // .getProvider(parent) : // securityProviderInfo.getSingleProvider // (parent); Object provider = securityProviderInfo.getProvider(callcontext); boolean isdelegate = provider.getClass() == delegate.getClass(); // 缺省的provider和被标识为使用的provider都需要进行同步调用 if (isdelegate || securityProviderInfo.isUsed() || securityProviderInfo.isIsdefault()) { if (isdelegate && !securityProviderInfo.isUsed()) { log.warn("调用的Provider[" + delegate.getClass() + "],[" + securityProviderInfo + "]被设置为未使用的服务提供者。"); } /** * 缺省的提供者,也就是默认的提供者,不需要进行事务处理时,只保留服务提供者的返回值 */ if (isdelegate) { try { method = provider.getClass().getMethod(method.getName(), method.getParameterTypes()); if(proxy == null) obj = method.invoke(provider, args); else obj = method.invoke(provider, args); } catch (InvocationTargetException e) { throwable = e.getTargetException(); log.error("调用服务提供者[" + securityProviderInfo + "]中方法[" + method + "]异常:" + e.getMessage(), e); } catch (Exception e) { throwable = e; log.error("调用服务提供者[" + securityProviderInfo + "]中方法[" + method + "]异常:" + e.getMessage(), e); } } else { try { method = provider.getClass().getMethod(method.getName(), method.getParameterTypes()); method.invoke(provider, args); } catch (Exception e) { // 不是事务方法调用时,忽略其他服务提供者方法执行时的异常 log.error("同步调用服务提供者[" + securityProviderInfo + "]中方法[" + method + "]异常:" + e.getMessage(), e); } } } // log.debug( // "providerInfoQueue.getSecurityProviderInfo("+ // i // +").getProvider()" + // providerInfoQueue.getSecurityProviderInfo(i) // .getProvider()); } // 抛出缺省服务提供者方法异常 if (throwable != null) throw throwable; if (interceptor != null) interceptor.after(method, args); return obj; } } catch (InvocationTargetException e) { if (interceptor != null) { try { interceptor.afterThrowing(method, args, e.getTargetException()); } catch (Exception ei) { ei.printStackTrace(); } } throw e.getTargetException(); } catch (Throwable t) { try { t.printStackTrace(); if (interceptor != null) interceptor.afterThrowing(method, args, t); } catch (Exception e) { e.printStackTrace(); } throw t; } finally { try { if (interceptor != null) interceptor.afterFinally(method, args); } catch (Exception e) { e.printStackTrace(); } interceptor = null; } } // else // { // return RPCHelper.getRPCHelper().rpcService((RemoteServiceID)serviceID, method, args,callcontext); // } } /** * 获取组件实例 * @param <T> * @param rettype * @param beanType * @param proxy * @return */ public static <T> T getBeanInstance(Class<T> rettype,Class beanType,MethodInterceptor proxy) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(beanType); enhancer.setCallbacks(new Callback[] { proxy, NoOp.INSTANCE }); enhancer.setCallbackFilter(filter); return (T) enhancer.create(); } /** * 获取组件实例 * @param <T> * @param rettype * @param beanType * @param proxy * @return */ public static <T> T getBeanInstance(Class<T> rettype,MethodInterceptor proxy) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(rettype); enhancer.setCallbacks(new Callback[] { proxy, NoOp.INSTANCE }); enhancer.setCallbackFilter(filter); return (T) enhancer.create(); } /** * 获取组件实例 * @param <T> * @param rettype * @param beanType * @param proxy * @return */ public static <T> T getBeanInstance(String rettype,MethodInterceptor proxy) { Enhancer enhancer = new Enhancer(); try { enhancer.setSuperclass(Class.forName(rettype)); } catch (ClassNotFoundException e) { throw new java.lang.RuntimeException(e); } enhancer.setCallbacks(new Callback[] { proxy, NoOp.INSTANCE }); enhancer.setCallbackFilter(filter); return (T) enhancer.create(); } private static AopProxyFilter filter = new AopProxyFilter(); }