通过模式访问非公共方法

时间:2011-12-13 10:57:54

标签: java design-patterns

可以使用哪种模式,或者是什么方式,如果我有一些类,其中一些接口受到保护,但是我想在包外面使用它而不是层次结构?
我不想更改那些旧(遗留)类的访问修饰符。

5 个答案:

答案 0 :(得分:2)

以下代码显示了如何访问此类字段:

Field privateStringField = PrivateObject.class.
        getDeclaredField("privateString");

privateStringField.setAccessible(true);
String fieldValue = (String) privateStringField.get(privateObject);

同样的方法也可以在方法中完成。但作为一种模式,您最好将其打包在静态实用程序方法中,例如ReflectionAccessor.accessField(Class class, Object object, String fieldName)

答案 1 :(得分:1)

如果您需要访问的类的部分是protected,则可以通过继承访问它。
您也可以通过那些可以访问受保护代码的类来访问受保护的部分。

可能使用的设计模式是Proxy。 在这种情况下,代理可以从您感兴趣的类继承,并使您感兴趣的方法在本地可用。

然而,在所有这些之前,请仔细考虑为什么界面的这些部分没有公共范围。可能有充分的理由不揭露它们。

答案 2 :(得分:0)

受保护方法的重点是使其无法从外部访问,并且保护方法通常是设计模式的一些重要方面。

您希望打破类的封装,并且没有设计模式可以帮助您实现这一点。只有脏反射调用。

答案 3 :(得分:0)

您可以使用类适配器。 Class适配器将派生自Legacy类,并公开公共接口方法,这些方法将在内部调用受保护的方法。您的客户端将调用类适配器的公共方法,该方法将在内部调用您的旧类。

答案 4 :(得分:0)

比反射快,但同样脏(或可能更多):在与遗留类相同的包中定义一个类。给它你想要的所有公共方法。让这些公共方法委托给遗留类的受保护方法。

我想在输入之后我需要洗手。