怎样把一个package下的所有class列出来啊.doc_第1页
怎样把一个package下的所有class列出来啊.doc_第2页
怎样把一个package下的所有class列出来啊.doc_第3页
怎样把一个package下的所有class列出来啊.doc_第4页
怎样把一个package下的所有class列出来啊.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.怎样把一个package下的所有class列出来啊? Copy to clipboardPosted by: xxrongPosted on: 2005-04-19 10:17I want to perform a test over all class in package com.mytest.All class in this class extends the same super class.This is my idea:for(each class clazz in packagecom.mytest)SuperClass sobjct=clazz.newInstant();Method m=sobjct.getMethod(test,.);/invoke test(.)sobject.invoke(.);How can I do this? 2.Re:怎样把一个package下的所有class列出来啊? Re: xxrongCopy to clipboardPosted by: 凤舞凰扬Posted on: 2005-04-22 16:32I think you should know the naming rule about java class. You can get the file list under the package at first. To iterate the file list and build a string which is the same as class name (for example , if your package is com.mytest , the string would be com.mytest.xxxx). And then , you transfer it into a class via reflect . You can use the function isAssignableFrom and judge whether the super class of current class is what you want. 3.Re:怎样把一个package下的所有class列出来啊? Re: xxrongCopy to clipboardPosted by: jigsawPosted on: 2005-04-22 17:33缺乏上下文。你得package在哪? 一个路径?一个jar?要么用File 要么用ZipFile 4.Re:怎样把一个package下的所有class列出来啊? Re: xxrongCopy to clipboardPosted by: 凤舞凰扬Posted on: 2005-04-25 13:32楼上的回复就不恰当了,要列出一个包下的所有类,前提当然是这个类是可以访问的,也就是自然要在classpath下的。不清楚所所的package在哪是什么意思?更不清楚什么叫一个路径,再说了,文件夹也好,jar也好,对class的装载是没有区别的,需要去考虑么?这个问题非常的简单,就是如同IDE的代码助手一样(敲一个.就列出包下的类),唯一需要注意的仅仅是类的可访问性(比如说有的类不是public,而是包访问或者protected) 5.Re:怎样把一个package下的所有class列出来啊? Re: 凤舞凰扬Copy to clipboardPosted by: JovePosted on: 2005-04-25 13:50IDE的做法应该也是设置好BuildPath或ClassPath后,对所有项目作一次检查,把类名都收集起来,所以或许不存在一个通用而简单的方法列出同一个Package的所有Class 6.Re:怎样把一个package下的所有class列出来啊? Re: 凤舞凰扬Copy to clipboardPosted by: jigsawPosted on: 2005-04-25 17:45凤舞凰扬 wrote:楼上的回复就不恰当了,要列出一个包下的所有类,前提当然是这个类是可以访问的,也就是自然要在classpath下的。不清楚所所的package在哪是什么意思?更不清楚什么叫一个路径,再说了,文件夹也好,jar也好,对class的装载是没有区别的,需要去考虑么?这个问题非常的简单,就是如同IDE的代码助手一样(敲一个.就列出包下的类),唯一需要注意的仅仅是类的可访问性(比如说有的类不是public,而是包访问或者protected)我已经说了他的问题缺乏上下文。刚好,前不久我写的那个class loader,就碰到这样的问题:1. class file的名字不可知2. class file的名字不规则3. class file存放的路径不规则(但是可知)也就是说,知道class.getName会返回什么,但是不知道到哪里去load这个类你说怎么办?不就是遍历咯如果是遍历一个文件夹,就用File如果这些class file是在同一个jar里面呢?当然就是ZipFile在这种情况下,显然需要考虑class file的来源 - 如果是网络上传过来的,又不一样了。你所考虑的,不过是最规范的情况,每个类都是规范的命名,每个类都老老实实的呆在自己package定义的文件夹里面。何况,即使是这种最规范的情况,我想当然的认为,在load class的时候,也要考虑class file的来源。我没有看过sun在这部分的代码实现。如果错了请指正。 7.Re:怎样把一个package下的所有class列出来啊? Re: xxrongCopy to clipboardPosted by: jigsawPosted on: 2005-04-25 17:53补充下刚看到sun的class loader是sun.misc.Launcher$AppClassLoader这东西没法看到代码了 8.Re:怎样把一个package下的所有class列出来啊? Re: jigsawCopy to clipboardPosted by: 凤舞凰扬Posted on: 2005-04-28 19:37jigsaw wrote:我已经说了他的问题缺乏上下文。刚好,前不久我写的那个class loader,就碰到这样的问题:1. class file的名字不可知2. class file的名字不规则3. class file存放的路径不规则(但是可知)也就是说,知道class.getName会返回什么,但是不知道到哪里去load这个类你说怎么办?不就是遍历咯如果是遍历一个文件夹,就用File如果这些class file是在同一个jar里面呢?当然就是ZipFile在这种情况下,显然需要考虑class file的来源 - 如果是网络上传过来的,又不一样了。你所考虑的,不过是最规范的情况,每个类都是规范的命名,每个类都老老实实的呆在自己package定义的文件夹里面。何况,即使是这种最规范的情况,我想当然的认为,在load class的时候,也要考虑class file的来源。我没有看过sun在这部分的代码实现。如果错了请指正。楼上为什么要这样做啊?看下面的代码,把包名改一下就可以了。try URL url = Thread.currentThread().getContextClassLoader().getResource(p2e/comm/beans) ;/System.out.println(url = + url) ;File file = new File(new URI(url.toString() ;String names = file.list() ;for (int i = 0; i names.length; i+) System.out.println(file = + namesi) ; catch ( URISyntaxException ex ) ex.printStackTrace();楼主的问题和你的问题不是同一个问题。楼主问题的前提自然是列出的包名肯定是在类装载路径下的,楼主只要找到相应的ClassLoader就可以了,默认,完全可以是当前访问的线程所在的装载类。至于类在jar还是在文件夹中,根本就不用关心,使用URL/URI,都是可以装载,只是protocol不同罢了,一个是jar:/ , 一个是file:/而已。 9.Re:怎样把一个package下的所有class列出来啊? Re: xxrongCopy to clipboardPosted by: 凤舞凰扬Posted on: 2005-04-28 19:41补充一下,使用URL,不管你类在jar中也好,文件夹中也好,网络中也好,只要ClassLoader可以装载,就是可以访问,对程序而言,也根本无所谓。其次,在如果使用web的环境中会遇到这样一个问题,会有多个ClassLoader,比如web一个,EJB一个,这个时候,就可能存在访问的路径不是所预料的路径,那么最好的使用方法就是通过线程获取当前所访问线程的ClassLoader就不会错了。sun.misc.Launcher$AppClassLoader只是JDK的默认ClassLoader实现罢了,楼上、楼主完全可以根据自己需要继承它的。 10.Re:怎样把一个package下的所有class列出来啊? Re: xxrongCopy to clipboardPosted by: jigsawPosted on: 2005-04-28 20:04呵呵 不知道你自己尝试过没有 你试试看就知道为什么不能这样用了 11.Re:怎样把一个package下的所有class列出来啊? Re: xxrongCopy to clipboardPosted by: jigsawPosted on: 2005-04-28 20:11不说别的 我就提这样一个问题 一个jar文件里面有一个文件夹叫test 里面有些文件 不知道名字这个jar里面有个class叫Test.class现在要你完成这个Test.java 把test里面的文件名字列出来你试试看你的方法能不能解决主席说的 没有调查就没有发言权关于class loader方面的知识 我好歹也知道一些 class loader 我也写过不止一个 我就再问你一个问题不继承class loader 自己写一个类 把classpath里面所有路径和jar里面的class列出来并load出来 你思路又是怎样?这就是我为什么说不知道sun是怎么实现的缘故 12.Re:怎样把一个package下的所有class列出来啊? Re: xxrongCopy to clipboardPosted by: 凤舞凰扬Posted on: 2005-04-29 09:03首先一点,先要感谢楼上的置疑,昨天我写的代码的确不能处理jar的方式,不过,这是非常容易,稍微改一下就可以了。看一下代码吧:import .* ;import java.io.File;import java.io.IOException;import java.util.Enumeration;import java.util.jar.*;/* author phenix.huang* version 1.0* create date : 2005-4-29 */public class Hello /* */public Hello() super() ;public static void main(String args) String packageName = javax/servlet/;URL url = Thread.currentThread().getContextClassLoader().getResource(packageName) ;String protocol = url.getProtocol() ;try if (protocol.equals(jar) JarURLConnection con = (JarURLConnection) url.openConnection() ;JarFile file = con.getJarFile() ;Enumeration enu = file.entries() ;String className = ;String entryName = ;while ( enu.hasMoreElements() ) JarEntry element = (JarEntry) enu.nextElement() ;entryName = element.getName() ;className = entryName.substring(entryName.lastIndexOf(/) + 1) ;if (!className.equals() & entryName.equals(packageName + className) System.out.println(className = + className) ; else File file = new File(new URI(url.toExternalForm() ;File files = file.listFiles() ;for (int i = 0; i files.length; i+) if (!filesi.isDirectory() System.out.println(className = + filesi.getName() ; catch ( IOException ex ) ex.printStackTrace(); catch ( URISyntaxException ex ) ex.printStackTrace();在使用这个代码中,要注意一个问题,编译路径的classpath和运行路径的classpath是不同的,楼上的帖子明显理解错了这个意思。这个代码可以测试出jar或者文件夹下面的类(当然,准确点还要对后缀名进行判断,不然其他文件也会显示出来)。在赞同楼上的置疑精神的同时,也请楼上反思反思,这种花不了一两个小时的代码为什么别人可以轻易写出来,而你总是那么多置疑,为什么不自己动手尝试尝试呢? 13.Re:怎样把一个package下的所有class列出来啊? Re: jigsawCopy to clipboardPosted by: 凤舞凰扬Posted on: 2005-04-29 09:11jigsaw wrote:不说别的 我就提这样一个问题 一个jar文件里面有一个文件夹叫test 里面有些文件 不知道名字这个jar里面有个class叫Test.class现在要你完成这个Test.java 把test里面的文件名字列出来你试试看你的方法能不能解决主席说的 没有调查就没有发言权关于class loader方面的知识 我好歹也知道一些 class loader 我也写过不止一个 我就再问你一个问题不继承class loader 自己写一个类 把classpath里面所有路径和jar里面的class列出来并load出来 你思路又是怎样?这就是我为什么说不知道sun是怎么实现的缘故首先我要告诉你,所有的java类的装载都必须有一个基本的ClassLoader,当然,你可以自己继承它,对某些特殊路径的Class进行装载,简单地说,你可以实现两个ClassLoader,一个是A(就相当于Web的类装载路径,指向web-inf/lib),另外一个是B(就相当于EJB的装载路径,指向EJB-JAR),如果你说,要同时把A和B的类显示出来,这并非做不到(前提是你要得到这两个ClassLoader),但是根本没有必要(因为即使可以查出来,因为当前ClassLoader的关系,不同ClassLoader下的类一样是无法访问的)。对于公用的jar或者类(也就是在web和EJB中都会使用到的),那么就可以利用Thread.currentThread().getContextClassLoader()来动态获得所访问当前类的ClassLoader(或许是A,或许是B,也或许是最基本的,比如说容器本身的),来获得当前可以访问的Class。楼上如果还是不太清晰,或者说对上个帖子我贴的代码不太理解,可以继续跟贴或者联系我就是。 14.Re:怎样把一个package下的所有class列出来啊? Re: jigsawCopy to clipboardPosted by: thinkPosted on: 2005-04-29 09:34凤舞凰扬 的方法是加载package处于文件夹下的思路,还需要考虑jar/zip文件,以及classloader的情况.看看下面的搜索方法是否完全?1.使用URL url = Thread.currentThread().getContextClassLoader().getResource(p2e/comm/beans) ;得到当前classloader所知道的package信息。2.判断所得url的protocol。 若是package,则可以使用File遍历;反之是zip/jar,则根据url和package得到jar的路径,使用new jarFile().entries()来遍历。3.系统根据Thread.currentThread().getContextClassLoader().getParent()沿着classloader的路径向上搜索得到jar的路径,但是有一个问题,如果package被当前classloader的下层加载,那这部分信息就会得不到。但是step2还是有问题,如果有两个以上同package name的jar,那么只能得到一个jar的路径,所以这个方法还是有问题,要求package name要比较明确。另外必要时可能需要通过classpath来得到所有的jar来遍历。 15.Re:怎样把一个package下的所有class列出来啊? Re: xxrongCopy to clipboardPosted by: jigsawPosted on: 2005-04-29 09:40呵呵 如果我没写过 我怎么会知道你的方法不能实现呢?我一开始就说过 是路径就用File 是jar就用ZipFile 我以前也跟你一样以为File也能访问jar里面 后来自己写了才发现事实是得用到ZipFile 我早就告诉你了 你还偏不信 说只是protocol不同 再看看你的实现 一开始用File 号称通吃路径和jar我提示了你之后 你又改用JarFile到底是谁没实践过就发言 很清楚了你倒还倒打一耙说我没实践过了。还有 不要以为懂一点apploader的知识就能唬人了 这类的文档满天飞 有那么一点点耐心坐下来看文档的人都早就知道了 16.Re:怎样把一个package下的所有class列出来啊? Re: thinkCopy to clipboardPosted by: 凤舞凰扬Posted on: 2005-04-29 10:59think wrote:凤舞凰扬 的方法是加载package处于文件夹下的思路,还需要考虑jar/zip文件,以及classloader的情况.看看下面的搜索方法是否完全?1.使用URL url = Thread.currentThread().getContextClassLoader().getResource(p2e/comm/beans) ;得到当前classloader所知道的package信息。2.判断所得url的protocol。 若是package,则可以使用File遍历;反之是zip/jar,则根据url和package得到jar的路径,使用new jarFile().entries()来遍历。3.系统根据Thread.currentThread().getContextClassLoader().getParent()沿着classloader的路径向上搜索得到jar的路径,但是有一个问题,如果package被当前classloader的下层加载,那这部分信息就会得不到。但是step2还是有问题,如果有两个以上同package name的jar,那么只能得到一个jar的路径,所以这个方法还是有问题,要求package name要比较明确。另外必要时可能需要通过classpath来得到所有的jar来遍历。楼上step2说得非常对,如果在不同的jar包中有同名的package,那么对于搜索类是存在问题的,但是这只是搜索方式的问题,并不代表很能做到而已。至于第三点,如果使用getParent(),那么得到的是上一级ClassLoader(一般说来,它和当前的ClassLoader的装载路径是不同的),那么自然无法装载当前路径中所想要找的class了。 17.Re:怎样把一个package下的所有class列出来啊? Re: jigsawCopy to clipboardPosted by: 凤舞凰扬Posted on: 2005-04-29 11:10jigsaw wrote:呵呵 如果我没写过 我怎么会知道你的方法不能实现呢?我一开始就说过 是路径就用File 是jar就用ZipFile 我以前也跟你一样以为File也能访问jar里面 后来自己写了才发现事实是得用到ZipFile 我早就告诉你了 你还偏不信 说只是protocol不同 再看看你的实现 一开始用File 号称通吃路径和jar我提示了你之后 你又改用JarFile到底是谁没实践过就发言 很清楚了你倒还倒打一耙说我没实践过了。还有 不要以为懂一点apploader的知识就能唬人了 这类的文档满天飞 有那么一点点耐心坐下来看文档的人都早就知道了看着你的帖子,我都不知道该说什么了。你既然实践过,早把你的代码贴出来,让楼主知道就好了。我还好心般写个sample,倒是成了你吹毛求疵的把柄了,真是费力不讨好。我之所以不信不能用file得到的原因是它的一个参数URI存在一定限制,如果是用流,两者是不需要区分的(当然,楼上这点是对的)。至于我用JarFile,说成了你的提示,就比较搞笑了。只是我看到你的帖子,用jar测试了一番,发现不行,才知道代码不完全而已。我倒是承认一点,我之前并没有写过,但是完全知道这并不难(当然也发现考虑的地方还不少),似乎倒是楼上被吓坏了似的,楼上既然实践过,怎么没有看到给个解决方法,反而强调什么缺乏上下文,那人家IDE工具的上下文又是从哪里来的啊。我不想和楼上去争论什么,这些帖子也是给楼主一些回答和提示罢了,如果要做成比较完善的API还是需要去考虑和测试许多的(我发现在查找java开头的包就有问题,而javax又可以,暂时没有弄清原因)。 18.Re:怎样把一个package下的所有class列出来啊? Re: xxrongCopy to clipboardPosted by: floaterPosted on: 2005-04-30 09:56Common, folks, no smoking please. Lets just confine ourselves in the tech area. - Ask the computer. 19.Re:怎样把一个package下的所有class列出来啊? Re: xxrongCopy to clipboardPosted by: 九佰Posted on: 2005-05-10 19:33xxrong wrote:I want to perform a test over all class in package com.mytest.All class in this class extends the same super class.This is my idea:for(each class clazz in packagecom.mytest)SuperClass sobjct=clazz.newInstant();Method m=sobjct.getMethod(te

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论