![](/img/trans.png)
[英]Is there a way to identify the object calling a specific method in java?
[英]Any way in Groovy/Java to identify the subclass calling a static method?
Groovy如此強大,我想知道是否有簡單的方法可以做到這一點。
場景:
我有一個抽象類AbstractSequence
。 然后,我有兩個(實際上更多)子類,稱為CasedSequence
和LowerCaseSequence
。 這些具體類中的每個類都必須具有“身份映射”,即類似於Set
但可以在其中基於功能相等性(覆蓋equals
和hashCode
)提取元素。
因此,我們有:
class CasedSequence extends AbstractSequence {
static Map identityMap = [:]
...
class LowerCaseSequence extends AbstractSequence {
static Map identityMap = [:]
實際上,出於解釋時間過長的原因,在各個類中對這些標識映射的操作還使用了許多靜態方法,從一個子類到另一個子類都使用相似/相同的方法。 所以我想知道如何重構身份映射到抽象基類中(然后在其中遷移很多重復的靜態方法)。
這導致我這樣:
abstract class AbstractSequence {
static Map getIdentityMap( Class clazz ) {
if( ! ( clazz in identityMaps ))
identityMaps[ clazz ] = [ : ]
identityMaps[ clazz ]
}
static Map identityMaps = [:]
然后在具體的類中,每次您想要使用身份映射時,都必須這樣做:
class CasedSequence extends AbstractSequence {
def someMethod( CasedSequence seq1 ){
CasedSequence seq2 = getIdentityMap( CasedSequence )[ seq1 ]
...
同樣,太復雜了以至於無法解釋為什么需要這種方式檢索東西...但是我只是想知道AbstractSequence.getIdentityMap()
是否有一種方法(優雅的Groovy方法? AbstractSequence.getIdentityMap()
來標識調用getIdentityMap()
的子類的類getIdentityMap()
,而不必將此類作為參數傳遞?
PS我寧願不使用Thread.stackTrace
:它很麻煩,並且不會提供實際的類對象,只有類名以及Groovy中的堆棧跟蹤是瘋狂的。 我在考慮Groovy反射,Groovy元類等方面的思考更多。
有興趣聽取任何Groovy專家的意見。
同時,我利用了一些Groovy魔術來解決問題,並利用了Groovy GDK在class
類中添加了一些方法的事實,其中一個是newInstance()
-非常有用。 這取決於所尋找的序列是否已經在同一性圖中而“制造或獲取”序列對象。
static makeOrGet( String string, Class clazz ) {
def dummySeq = clazz.newInstance( DUMMY_STRING )
// NB the constructor identifies the string DUMMY_STRING to prevent this new object being
// properly "registered" (i.e. put in the identity map), which would be wrong because
// the dummy seq is just to find out whether the sequence with "string" is actually
// present in the map
def seq
// disguise the dummy sequence to flush out an existing sequence with String "string"
dummySeq.string = string
if( dummySeq in getIdentityMap( clazz ) )
seq = getIdentityMap( clazz )[ dummySeq ]
else
// NB constructor puts the new "clazz" object in the identity map
seq = clazz.newInstance( string )
seq
}
...因此可以使用各種不同的類作為參數2來調用上述方法,然后傳遞clazz
類的clazz
,該對象從身份映射表提取或構造(並放入映射表)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.