Wie der Zugriff auf package-private-Klasse aus einer Klasse, in der einige andere Paket?

Habe ich folgende classses

Hello.java

package speak.hello;

import java.util.Map;

import speak.hi.CustomMap;
import speak.hi.Hi;

public class Hello {

    private Hi hi;

    Hello(Hi hi) {
        this.hi = hi;
    }

    public String sayHello() {
        return "Hello";
    }

    public String sayHi() {
        return hi.sayHi();
    }

    public Map<String, Object> getMap() {
        return hi.getMap();
    }

    public void clearMap() {
        hi.getMap().clear();
    }

    public void discardMap() {
        CustomMap map = (CustomMap) hi.getMap();
        map.discard();
    }

    public static void main(String[] args) {
        Hello hello = new Hello(new Hi());
        System.out.println(hello.sayHello());
        System.out.println(hello.sayHi());
        System.out.println(hello.getMap());
        hello.clearMap();
        System.out.println("--");
        hello.discardMap();
    }

}

Hi.java

package speak.hi;

import java.util.HashMap;
import java.util.Map;

public class Hi {
    public String sayHi() {
        return "Hi";
    }

    public Map<String, Object> getMap() {
        return new CustomMap<String, Object>();
    }
}

CustomMap.java

package speak.hi;

import java.util.HashMap;

public class CustomMap<K, V> extends HashMap<K, V> {
    private static final long serialVersionUID = -7979398843650044928L;

    public void discard() {
        System.out.println("Discarding Map");
        this.clearCache();
        this.clear();
    }

    @Override
    public void clear() {
        System.out.println("Clearing Map");
        super.clear();
    }

    private void clearCache() {
        System.out.println("Clearing Map");
    }
}

Dies funktioniert gut, bis ich entfernen public zugriffsspezifizierer von CustomMap

package speak.hi;

import java.util.HashMap;

class CustomMap<K, V> extends HashMap<K, V> {
    private static final long serialVersionUID = -7979398843650044928L;

    public void discard() {
        System.out.println("Discarding Map");
        this.clearCache();
        this.clear();
    }

    @Override
    public void clear() {
        System.out.println("Clearing Map");
        super.clear();
    }

    private void clearCache() {
        System.out.println("Clearing Map");
    }
}

Compiler schreit, dass

Art sprechen.hi.CustomMap ist nicht sichtbar

Nun, Wenn ich keine Optionen ändern speak.hi.CustomMap (Dritten Glas etc..) gibt es eine Möglichkeit, ich könnte noch CustomMap aus speak.hello.Hello?


Eine Möglichkeit, die ich kenne, ist, sich zu bewegen speak.hello.Hello zu speak.hi.Hello als Jetzt Hallo ist im Paket speak.hi Zugriff auf package-private Class Hi


Gibt es eine andere Möglichkeit, dies zu tun ? Mit der spiegelung vielleicht ?


BEARBEITEN :Aktualisiert, mit zusätzlichen details auf Wunsch von @StephenC

InformationsquelleAutor Prashant Bhate | 2011-11-25

Schreibe einen Kommentar