【问题标题】:Can't Access Protected Method of Instantiated Class无法访问实例化类的受保护方法
【发布时间】:2013-01-31 21:34:23
【问题描述】:

我正在尝试访问这个受保护的类: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(); throws Image 类型的方法 canDraw() 不可见

boolean foo = super.canDraw(); throws 方法 canDraw() 未为 HttpJspBase 类型定义

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

【问题讨论】:

    标签: java jsp protected aem


    【解决方案1】:

    方法受到保护。因此,您无法从包外部以及从该类继承的类访问它。

    您正试图从 JSP 页面访问受保护的方法。 JSP 页面不是 Image 的子类,因此无法访问该方法。

    如果没有更好的方法来做您想做的事情,请子类化 Image 并为您尝试访问的属性创建一个公共访问器。

    【讨论】:

    • 几乎是这样,但您也可以从同一个包中的类访问受保护的字段/方法。
    • 同样来自同一个包中的类。
    • 好吧,您正在编写一个 JSP,因此您显然可以访问 -some- 代码。您仍然可以扩展相关类并提供访问器方法。 'public class MyImage extends Image' 等
    • 我可以访问代码,但不能访问扩展类所需的源类。
    • 你不需要类的源代码来扩展它。只要您要扩展的类不是最终类,您就可以扩展任何您想要的东西。
    【解决方案2】:

    嗯,它是受保护的,您正试图从Servlet 子类访问它(JSP 被编译成 Servlet)。根据 java 规范,你不能这样做。

    将其公开(如果您有源代码),或将原始类扩展为具有提供相同数据的公共方法的类。或者(不推荐),使用反射来改变它的可访问性。

    【讨论】:

    • 不幸的是,我无法将其公开,因为我无权访问源代码。什么是反射?
    【解决方案3】:

    正如其他答案中提到的,您必须扩展 Image、覆盖 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)

    【讨论】:

    • 我认为这是一个很好的测试实践,因为它返回的值只是布尔值。这比实际应用更适合我的学习。
    猜你喜欢
    • 2011-12-20
    • 1970-01-01
    • 2020-04-23
    • 2017-12-14
    • 2015-11-04
    • 2020-07-26
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多