| 
         
     
     | 
     | 
    
  
    | 
    关于包Package信息的论述 | 
   
  
     | 
   
  
     | 
   
  
    | 
     作者:未知  来源:月光软件站  加入时间:2005-2-28 月光软件站  | 
   
  
    包(Package)的信息存放在哪里?
文件夹的路径是否就代表包的路径?
文件夹的路径是创建和编译的时候根据包信息生成的,包的信息存放在class文件中
这里有个测试的例子
package mytest.test;
public class test {
  public test() {
      System.out.print("hello  ");
  }
  public static void main(String[] args)
  {
   test tObj = new test();
   try {
     Class.forName("mytest.test.testa").newInstance();
   }
   catch (ClassNotFoundException ex) {
   }
   catch (IllegalAccessException ex) {
   }
   catch (InstantiationException ex) {
   }
  }
}
这里面的mytest.test.testa在工程创建时没有这个类
然后我编写了一个独立的java文件(用ultraEdit编辑)
package mytest.test;
public class testa
{
	public testa()
	{
		System.out.print("\n\nhelloA");
		
		}	
	}
}
编译成class文件放到\Mytest\classes\mytest\test文件夹下
运行后的结果是
hello  
helloA
就是说主程序找到了这个类
(如果在独立的java文件中没有包的声明,主程序就找不到这个类,这说明在class文件中有包的信息)
我在testa.java中的包是package mytest.testdir;
testdir是不存在的一个文件夹,手动创建后,并把编译好的class文件放到该目录下。
主类也做相应修改  Class.forName("mytest.testdir.testa").newInstance();
运行成功,testa类被装载成功。
得到的结果是
  类装载的搜索是依据文件路径,然后依据.class里面的包信息,一切符合了才会加载成功
扩展开了讲
如果我定义一个接口,然后公布这个接口由我的客户或二次开发商来实现这个接口。
我在主程序中遍历\Mytest\classes\mytest\test目录下的class文件
获得文件名,然后根据这些文件名生成菜单,每个菜单对应一个。
处理菜单事件(动态),Class.forName("mytest.test.testa").newInstance();并转换成我们公布的接口,利用
接口调用里面的函数。
这个就实现了扩展程序的功能(类似游戏的外挂)。
以前知道可以通过dll来实现这个功能,现在也可以用java来实现了。
总结:
   包的信息存放在.class文件中,装载时先依据文件路径,再确定.class文件中的包信息
   可以通过此特性来创建程序的外挂。
 
 
  | 
   
  
     | 
   
  
     相关文章:相关软件:  | 
   
   
      |