当前位置: 代码迷 >> J2SE >> 求大神确认一上,有这回事吗
  详细解决方案

求大神确认一上,有这回事吗

热度:78   发布时间:2016-04-24 00:40:21.0
求大神确认一下,有这回事吗?
最近在写java测试程序的时候突然遇到了一个问题:java默认包中的public类是不能在其他包中直接调用的

 

  首先,总结一下默认包中类的使用范围,java默认包中的类可以实例化其它包中的public类,但是其它包中的类是不能显式实例化默认包中的类这个特性在JDK1.4以后的版本成立;

  其次,可以通过反射来访问默认包中的类



------解决方案--------------------
是的,直接调用不了,要想调用,需要把该类放到有名包中去。

------解决方案--------------------
本身写无名包不是太好的一种习惯,从技术角度来讲,硬是想调用默认包的话,就要用到反射。
下面是个例子,参考一下吧。

非默认包是可以调用到默认包里的类的。这里要用到反射。比如:
在默认包里有个类:
public class DefaultPackage {
public void disp(){
System.out.println("Hello World!");
}
}

而如果你想再包test下的类中调用disp()方法可以这样:
package test;

import java.lang.reflect.*;

public class TestDefaultPackage {

public static void main(String[] args) throws Exception{
Class c = Class.forName("DefaultPackage");
Method m = c.getDeclaredMethod("disp", null);
m.invoke(c.newInstance(), null);
}

}
------解决方案--------------------
探讨

这个规则有点奇怪。因为当时,第一想法就是,无名包的类应该是项目中全局可见的,可事实且且相反,是全局不可见的,且无任何方法可以导入(imports)。

------解决方案--------------------
import 一个无名包下的类,
这个语法仅在 JDK1.3 下有效

可能是鼓励大家多定义包吧,以免大家都在无名包下写代码,为了区分不同的功能,把类名定义的又臭又长
  相关解决方案