簡體   English   中英

訪問父級子類中靜態類的受保護成員

[英]Accessing protected member of static class in subclass of the parent

類ExtendedDismaxQParser具有靜態成員類Clause:

public class ExtendedDismaxQParser {
    protected static Class Clause {
        protected String foo, bar;
    }
    public Clause getAClause {
        Clause c;
        // misc code that isn't important
        return c;
    }
}

然后,我在另一個包中擴展了該類:

public class SpecialDismaxQParser extends ExtendedDismaxQParser {
    public void whatever() {
        Clause c = super.getAClause();
        boolean baz = c.foo.equals("foobar"); // <-- This doesn't compile
    }
}

盡管事實是類子句受到保護,成員變量foo也受到保護,但您似乎無法訪問foo成員變量。

我只希望能夠檢查有關受保護的靜態類Clause的成員變量foo的某些信息。 我該怎么做(最好是無反射)?

我非常希望不必修改父類,因為它是庫的一部分。

aioobe的評論是正確的。

與外部類共享一個超類還不足以訪問靜態內部類的受保護成員。

調用方的類不擴展Clause,並且在不同的包中。 為了使protectedprotected相關,您必須從Clause的子類中訪問foo,或者從與ExtendedDismaxQParser相同的程序包中的類訪問它。

正如評論中已經說過的那樣,@ Nathan Hughes的答案很好地解釋了這一點,您不能訪問Clauseprotected字段,因為它不是正在擴展的類。

不幸的是,訪問此字段的唯一方法是通過反射

public class SpecialDismaxQParser extends ExtendedDismaxQParser {
    public void whatever() {
        try {
            Field fooField = Clause.class.getDeclaredField("foo");
            fooField.setAccessible(true);
            Clause c = super.getAClause();
            boolean baz = fooField.get(c).equals("foobar");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

受保護的訪問修飾符僅允許在包內訪問變量和方法。 您已經在Clause類的包內創建了類。

反思在這里對您沒有任何好處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM