假设您必须访问在代码中其他位置接收到的Java对象的受保护方法。您的解决方案是什么?
我知道一种方法:您可以使用反射并在Method对象上调用setAccessible(true)。
还有其他想法吗?
我知道一种方法:您可以使用反射并在Method对象上调用setAccessible(true)。
还有其他想法吗?
另一种选择是创建一个继承第三方类的类,该类具有您感兴趣的受保护方法。
public class ThirdPartyClass
{
protected void foo(){}
}
public MyClass extends ThirdPartyClass
{
public void callFoo()
{
foo();
}
}
package com.foo;
public class OtherObjectWrapper {
private com.foo.OtherObject wrappedObject;
public OtherObjectWrapper(com.foo.OtherObject wrappedObject) {
this.wrappedObject = wrappedObject;
}
public void callTheProtectedMethod() {
wrappedObject.callTheProtectedMethod();
}
}
如前所述,子类化通常是访问该方法的标准方式。其他方法(在同一包装器中,反射)通常不应使用,因为如果您无法扩展类(由于是最终的),则经常有很好的理由使访问该方法变得困难。
如果库的质量还算不错,您绝对不应该使用除子类化以外的任何其他手段来访问受保护的方法或根本不访问该方法。
new ClassWithProtectedMethod() {
@Override
protected void method() {
super.method();
}
}.method();
method()
设为public是不必要的(因为新的匿名类与原类在同一个包中)。