在java中访问受保护的类

时间:2014-10-24 08:53:49

标签: java protected mapper

我有一个对象表示如下:

 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有一些我想访问的受保护成员(设置,清理和映射方法),但我无法访问它们。我应该如何设计它以确保我可以访问这些方法?

2 个答案:

答案 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
    }
}

再见 马库斯