我有一个对象表示如下:
public final class FooFunc<KEYIN extends WritableComparable,
VALUEIN extends Writable,
KEYOUT extends WritableComparable,
VALUEOUT extends Writable> extends FooFunction<T<KEYIN,VALUEIN>,
T<KEYOUT,VALUEOUT>> implements Q<T<KEYOUT,VALUEOUT>>, S
private transient Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT> mapper; // main is this line
...
}
我正在使用地图制作工具,其信息位于:link
Mapper有一些我想访问的受保护成员(设置,清理和映射方法),但我无法访问它们。我应该如何设计它以确保我可以访问这些方法?
答案 0 :(得分:1)
您可以使用Reflections来访问这些方法。
看看Class.getDeclaredMethods()
和AccessibleObject.setAccessible()
但如果你需要这样做,你的设计绝对是错误的。隐藏这些方法是有原因的。
答案 1 :(得分:1)
类的受保护方法只能由该类的子类访问。我同意Dawnkeeper的观点,如果你试图通过反射访问受保护的方法,它很可能是一个设计问题。它们的用途是允许子类更改其超类行为的特定方(参见例如模板方法模式:http://en.wikipedia.org/wiki/Template_method_pattern)
e.g。
public class Foo{
public int getX() {return getProtectedX();}
protected int getProtectedX() {return 42;}
}
public class Bar extends Foo{
protected int getProtectedX() {return 43;}
}
public class runner{
public static void main()
{
Foo x=new Foo();
System.out.println(x.getX()); // 42
Bar y=new Bar();
System.out.println(y.getX()); // 43
}
}
再见 马库斯