A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔维友 中级黑马   /  2012-11-18 12:17  /  1798 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 崔维友 于 2012-11-19 08:48 编辑

       我有一个需求:默认包中有个External.java文件、internal文件夹,在internal中有Internal.java文件。要Internal访问默认包中的External。
       External文件代码:
  1. public class External
  2. {
  3.         public void show()
  4.         {
  5.                 System.out.println("这是外部Ext,被内部的Int调用");
  6.         }
  7. }
复制代码

       Internal文件代码:
  1. package internal;
  2. /*
  3. //以下语句都错误
  4. import External;
  5. import .External;
  6. import ..External;
  7. import *.External;
  8. */

  9. class Internal
  10. {
  11.         public static void main(String[] args)
  12.         {
  13.                 System.out.println("子包中的Int,访问默认包中的Ext");
  14.                 External ex=new External();
  15.                 ex.show();
  16.         }
  17. }
复制代码
       无论如何,按照以上方式是绝对不会成功的。因为从 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文件:
  1. package internal;
  2. import java.lang.reflect.*;

  3. public class Internal
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 System.out.println("子包中的Int,访问默认包中的Ext");
  8.                 try
  9.                 {
  10.                         Class ext=Class.forName("External");
  11.                         Method m=ext.getDeclaredMethod("show");
  12.                         m.invoke(ext.newInstance());
  13.                 }
  14.                 catch (Exception e)
  15.                 {
  16.                         System.out.println("反射错误:"+e.toString());
  17.                 }
  18.         }
  19. }
复制代码
编译,跳过其中出现的提示,执行。

因为现在刚开始学习,对Java的反射机制不甚了解,只是摸索着通过了这个例子。哪位精通的,还请多多赐教!


评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

2 个回复

正序浏览
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 文档
回复 使用道具 举报
学习了,我现在还没看到反射机制呢,等以后看过了,看能不能帮忙!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马