黑马程序员技术交流社区
标题: 从子包访问默认包中的类 [打印本页]
作者: 崔维友 时间: 2012-11-18 12:17
标题: 从子包访问默认包中的类
本帖最后由 崔维友 于 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的反射机制不甚了解,只是摸索着通过了这个例子。哪位精通的,还请多多赐教!
作者: 刘菲 时间: 2012-11-18 12:30
学习了,我现在还没看到反射机制呢,等以后看过了,看能不能帮忙!
作者: 森仔 时间: 2012-11-18 14:29
Class ext=Class.forName("External");返回与带有给定字符串名的类或接口相关联的 Class 对象
Method m=ext.getDeclaredMethod("show");返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法,name 参数是一个 String
ext.newInstance() 表示创建类的一个新实例
Java的反射机制的实现主要借助于4个类:class,Constructor,Field,Method;其中class代表的是类对象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象。具体的方法使用你可以参考下JDK API 文档
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |