本帖最后由 崔维友 于 2012-11-19 08:48 编辑
我有一个需求:默认包中有个External.java文件、internal文件夹,在internal中有Internal.java文件。要Internal访问默认包中的External。
External文件代码:
- public class External
- {
- public void show()
- {
- System.out.println("这是外部Ext,被内部的Int调用");
- }
- }
复制代码
Internal文件代码:- package internal;
- /*
- //以下语句都错误
- import External;
- import .External;
- import ..External;
- import *.External;
- */
- class Internal
- {
- public static void main(String[] args)
- {
- System.out.println("子包中的Int,访问默认包中的Ext");
- External ex=new External();
- ex.show();
- }
- }
复制代码 无论如何,按照以上方式是绝对不会成功的。因为从 J2SE 1.4 开始,Java 编译器不再支持 import 进未命包名的类、接口。
http://192.9.162.55/javase/compatibility_j2se1.4.html 以及
http://www.oracle.com/technetwork/java/javase/compatibility-j2se1-141394.html 这里保留了说明。
要想使用访问默认包中的类,我们用到另一个方法,反射。Java的反射机制是通过反射API来实现的,它允许程序在运行过程中取得任何一个已知名称的类的内部信息。反射API位于java.lang.reflect包中,主要包括以下几类: 1).Constructor类:用来描述一个类的构造方法 2).Field类:用来描述一个类的成员变量 3).Method类:用来描述一个类的方法. 4).Modifer类:用来描述类内各元素的修饰符 5).Array:用来对数组进行操作. 具体的还得查看帮助文档,看下我这里修改后的Internal.java文件:
- package internal;
- import java.lang.reflect.*;
- public class Internal
- {
- public static void main(String[] args)
- {
- System.out.println("子包中的Int,访问默认包中的Ext");
- try
- {
- Class ext=Class.forName("External");
- Method m=ext.getDeclaredMethod("show");
- m.invoke(ext.newInstance());
- }
- catch (Exception e)
- {
- System.out.println("反射错误:"+e.toString());
- }
- }
- }
复制代码 编译,跳过其中出现的提示,执行。
因为现在刚开始学习,对Java的反射机制不甚了解,只是摸索着通过了这个例子。哪位精通的,还请多多赐教!
|