我有以下课程
你好
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();
}
}
嗨.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");
}
}
直到我public
从中删除访问说明符之前,这都可以正常工作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");
}
}
编译器大喊
类型speak.hi.CustomMap不 可见
现在,如果我没有修改的选项speak.hi.CustomMap
(第三方jar等),还有什么我可以使用CustomMap
的方法speak.hello.Hello
吗?
我知道的一个选项是转到speak.hello.Hello
,speak.hi.Hello
因为Hello已在程序包中,speak.hi
它可以访问程序包私有类。Hi
还有其他方法吗?也许使用反射?
编辑 :按@StephenC的要求更新了其他详细信息
以下default
方法使用反射调用作用域类方法
public void discardMap() {
//CustomMap map = (CustomMap) hi.getMap();
//map.discard();
try {
Object o =hi.getClass().getMethod("getMap").invoke(hi);
Method m = o.getClass().getMethod("discard");
m.setAccessible(true);
m.invoke(o);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
问题内容: 我想从另一个软件包访问主软件包,但这是不可能的,因为主文件不在目录中。我已经尝试将主文件放在目录中,但是当我尝试导入它时,出现此错误: 我想要这个的原因是因为我有一个tcp服务器和一个Web服务器一起工作。Web服务器可以通过主程序包获取tcp服务器,而tcp服务器可以通过主程序包获取web服务器。 我已经使它可以与Web服务器和tcpserver相互读取(中间没有主程序包),但是我想
问题内容: 我希望我说的是我的话。我有这样的课: 和其他这样的类: 这是从其他类(在该示例代码中)访问和更改其值的正确方法吗,是否有更好或更合适的解决方案?请注意,这是具有方法的类。 问题答案: 从另一个类访问私有变量的正确方法是使用getter和setter方法。否则,您应该将该变量公开。 那是: 但是,直接返回私有数据是一种不好的做法- 允许外部代码修改您的私有状态。通常,您应该返回私有数据的
问题内容: 我的班级有一个名为DataStorage的哈希图: 如何在另一个类中访问此HashMap中的数据? 问题答案: 将HashMap创建为实例变量,并提供一种将其访问类API的方法:
问题内容: 我在第3方中设计的课程很差,我需要访问它的一个私有字段。例如,为什么我需要选择私有字段? 如何使用反射获取值? 问题答案: 为了访问私有字段,你需要从类的声明字段中获取它们,然后使其可访问: 编辑:正如所说,访问字段,将字段设置为可访问并检索值都可能引发,尽管上面需要注释的唯一检查异常。 在NoSuchFieldException如果你问一个字段由不符合声明的字段的名称将被抛出。 该会
问题内容: 如果我有一个包私有的Java类(用“ class”声明,而不是“ public class”),那么将内部方法声明为public或protected或package- private确实没有区别,对吗?那么我应该使用哪个,或者什么时候该使用呢?我有点困惑。 问题答案: 如果我有一个包私有的Java类(用“ class”声明,而不是“ public class”),那么将内部方法声明为p
问题内容: 我现在正在与其他人一起在grails项目中工作。我必须编写一些Java类。但是我需要访问使用groovy创建的可搜索对象。看来,该对象必须放在默认包中。 问题答案: 在J2SE 1.4之前,你可以使用以下语法从默认包中导入类: 这是不再允许。因此,要从打包的类中访问默认的包类,需要将默认的包类移动到自己的包中。 如果你可以访问groovy生成的源,则需要进行一些后期处理,以将文件移动到