使用反射呼叫匿名內部類時應該注意的一些地方

2022-07-18 17:54:14 字數 1219 閱讀 8433

06年寫的

在使用匿名內部類時,當使用了反射機制來呼叫其中的方法就會出現訪問異常,這是在前幾天寫程式時遇到的,所以在寫匿名內部類時一定要注意是否在其它地方使用了反射呼叫。下面給出部份**來說明此問題。

public

class

supertest

}public

class

exec

static

void

run(test1 target, class cls, string method)

catch

(exception x)

}}public

class

test

});}

}

上面的**看似很簡單執行時一般都不會有什麼錯誤出現,但是如果將類test與exec放在不同包的時候,就會出現異常。因為exec類無法呼叫test中匿名內部類的hello方法導致異常,也許到這裡大家都覺得容易理解,但為什麼在注釋1的地方可以通過,在注釋2的地方就會出異常呢?這個問題就會使許多朋友開始疑惑了。下面針對該部份內容進行討論學習。

根據匿名內部類的定義,我們知道:

exec.run(new

supertest()

});

的意思是產生乙個匿名的class物件,此匿名class繼承自supertest類,new後返回乙個supertest型別的物件。那麼為什麼注釋2的地方會出異常呢,我們仔細想一下匿名內部類的定義就很清楚了,上面這段**可以等同於下面:

exec.run(new test().new

mysupertest());

class mysupertest extends

supertest

}

這樣就很容易理解了,在注釋2的地方使用了target.getclass(),而它得到的class就是mysupertest,但是此類的修飾符是default的,也就是說在其它包是不能訪問的,所以使用此方法進行呼叫時會出現異常。雖然容易理解,但開發時經常不注意,常出現類似的問題。

解決方法當然也是有多種的,呵呵,如果將class mysupertest加上public修飾符,可以解決此問題,但這樣就不能再使用匿名內部類了,所以也可以將exec類進行修改,就是在注釋2的地方獲取物件的父類,然後再呼叫,這樣就可以使用這種結構(但需注意,獲取父類時一定要先判斷是否有所要呼叫的方法,因為有的並不包含此方法)。

內部類 匿名內部類的使用

內部類的使用 classouter classinner public voidget a a public voidtest this.get newa public voidfun1 system.out println i public classtest public static void...

匿名內部類的使用

匿名內部類通常用於簡化 的編寫,使用匿名內部類還有個前提條件 必須繼承乙個父類或實現乙個介面 之前對於new了乙個介面或者抽象類不是很理解,現在知道 因為沒有名字,也就沒有建構函式,所以只能通過顯示呼叫父類函式建立匿名內部類。還有關於匿名內部類使用外部類變數作為形參傳入時需要用final修飾,在網上...

匿名內部類使用方式

抽象類是沒有類物件的,因為抽象類的成員抽象方法沒有方法體,建立類物件沒有意義,所以通常實現抽象類的抽象方法是通過繼承重寫了方法,再呼叫子類的類物件實現 而匿名內部類實現抽象方法更為簡單,下面通過乙個簡單的例子使用三種方法演示一下匿名內部類的用法 定義乙個抽象類,其中有乙個 study 抽象方法 ab...