我想檢查一些CGLib代理Groovy類,從Java,Groovy生成的方法,以瞭解什麼是返回和參數類型的方法。當然,考慮這個Groovy類:檢查來自Java的CGLib代理Groovy類
class Person {
String name
}
Groovy產生的getName()
和setName()
方法的name屬性。 getName()
據推測返回String
和setName()
大概需要String
。
但通過使用CGLIB這個類和使用CGLIB的MethodInterceptor,method.getName()
回報getMetaClass
和method.getReturnType()
回報groovy.lang.MetaClass
攔截針對getName
調用時。
有沒有辦法從MethodInterceptor內部學習實際方法名稱和返回類型?
編輯:這裏是攔截Person.getName()的調用時調用堆棧:
ExplicitMappingInterceptor.intercept(Object, Method, Object[], MethodProxy) line: 42
GroovyMMTester$A$$EnhancerByCGLIB$$915b5b4.getMetaClass() line: not available
CallSiteArray.createPogoSite(CallSite, Object, Object[]) line: 144
CallSiteArray.createCallSite(CallSite, Object, Object[]) line: 161
CallSiteArray.defaultCall(CallSite, Object, Object[]) line: 45
AbstractCallSite.call(Object, Object[]) line: 108
AbstractCallSite.call(Object) line: 112
GroovyMMTester$Map.configure() line: 18 <-- Person.getName() call is in here, but doesn't show
什麼原因使用CGLib而不是[Metaclass](http://groovy.codehaus.org/Evaluating+the+MetaClass+runtime)? – ChrLipp
我想你所調用的是Person對象上的getName(),而不是直接Person.getName()。對? – Alfergon