2013-01-31 96 views
1

我試圖訪問此受保護類:protected boolean canDraw(),並將其值放置到變量中。兩種方法我試圖訪問它不工作:無法訪問實例化類的受保護方法

<%@ page import="com.day.cq.wcm.foundation.Image" %> 
    <%@include file="/apps/tju/global.jsp"%> 
    <% //..... 
     Image thisImage = new Image(resource); %> 

boolean foo = thisImage.canDraw();拋出從類型圖像的方法canDraw()是不可見的

boolean foo = super.canDraw();拋出的方法canDraw()未定義爲類型HttpJspBase

正在使用的類的完整javadoc可以找到她e:http://dev.day.com/docs/en/cq/5-3/javadoc/com/day/cq/wcm/foundation/Image.html

回答

3

該方法受保護。因此,您不能從包和從類繼承的類之外訪問它。

您正嘗試從JSP頁面訪問受保護的方法。 JSP頁面不是Image的子類,因此無法訪問該方法。

如果沒有更好的方法去做你想要做的事情,那麼創建一個Image子類,併爲你試圖訪問的屬性創建一個公共訪問器。

+0

幾乎真實的,但你也可以訪問受保護的領域/方法從類的同一個包。 – emka86

+0

也來自同一包中的類。 –

+0

不幸的是,我沒有源代碼訪問權限。 –

1

好吧,它是受保護的,並且您試圖從Servlet子類訪問它(JSPs被編譯到Servlet中)。你不能這樣做,通過java規範。

將其公開(如果您有源代碼)或將原始類擴展爲具有提供相同數據的公共方法的類。或者(不推薦),使用反射來改變其可訪問性。

+0

不幸的是,我無法公開,因爲我無法訪問源代碼。什麼是反思? –

1

正如在其他答案中所提到的,您將不得不擴展圖像,覆蓋canDraw並使公開的覆蓋方法的可見性。

檢查canDraw()後你打算做什麼?我想它是受保護的原因。這是推測性的,但如果你所做的只是檢查canDraw(),然後繪製它是否返回true,你實際上可以直接調用draw()。 Javadoc中說明它在內部檢查canDraw():

http://dev.day.com/docs/en/cq/current/javadoc/com/day/cq/commons/ImageResource.html#draw(java.io.Writer)

+0

我認爲這是一個很好的做法來測試,因爲它返回的值只是布爾值。這比我的學習更適合實際應用。 –

相關問題