我已经知道如何获取所有可用的包,但是我试图只获取我在自己的java项目中创建的包。
例如,我不希望java.util出现在包列表中。
我使用下面的代码来收集类:
List<String> result = new LinkedList<String>();
Package[] packages = Package.getPackages();
for(Package pack : packages)
{
result.add(pack.getName());
}它工作得很好,现在我只想摆脱所有的系统包。
有没有办法过滤这些包,只保留我定义的包?
另外,我并不担心效率,这样做的目的是尽可能的慢,它只会在我的程序开始时运行一次。
我看了几个相关的问题,但没有一个是我想要的。
如果有一种方法可以判断包名是否是系统包,那么它将完美地完成这项工作。
编辑!
我将其作为API的一部分,因此,我不能简单地将包名与设置的令牌进行比较,以确定它是否是我正在使用的包名,我不希望需要进行任何编辑,只需将类文件放在我的项目中并使用它,而不管我选择什么包名。
我会尝试的一种方法是扫描jar文件,检查是否存在与包名相同的目录,但它似乎不起作用,并给我带来随机错误。每当我扫描jar文件时,我都会得到错误消息"Can‘t access jar file,is by by another process?“。
扫描jar文件肯定可以查看类是否存在于我的项目(jar文件)中,但是另一个限制是我必须编译来测试它,不能只在Eclipse中测试它,我编辑了10次代码,试图让jar文件搜索工作,每次都会得到访问错误,因为javaw.exe使用了jar文件,它不允许我读取其中的文件。
Edit2!
有人建议我列出所有已知的系统类,并将其与该列表进行比较,如果不同的JDK没有一些不同的类,这将会起作用,所以我想知道一个新的问题,有没有办法获得当前JRE系统库中的所有jar文件?然后我可以通读它们,并将它们的所有包添加到过滤器中。
发布于 2012-03-05 05:21:49
我不知道这里面有什么方法...只是为了上课。但你可以通过运行这个程序来创建一个自己的列表,也许可以保存到自己程序中每个操作系统的文件中。
Package[] pa = Package.getPackages();
for (int i = 0; i < pa.length; i++) {
Package p = pa[i];
System.out.print("\"" + p.getName() + "\", ");
}然后加载这个列表并遍历其他程序中要过滤这些包的每个包……
String[] systemPackages = new String[]{<all names of the packages>};
Package[] pa = Package.getPackages();
int n = 0;
for (int i = 0; i < pa.length; i++) {
Package p = pa[i];
boolean isSystemPackage = false;
String pname = p.getName();
for (int j = 0; j < systemPackages.length; j++) {
String spname = systemPackages[j];
if (pname.equals(spname)) {
isSystemPackage = true;
systemPackages[j] = null;
break;
}
}
if (!isSystemPackage) {
n++;
} else {
pa[i] = null;
}
}
Package[] projectPackages = new Package[n];
for (int i = 0, j = 0; i < pa.length; i++) {
Package p = pa[i];
if (p != null) {
projectPackages[j] = p;
j++;
}
}所以你可以检查一下...当然,java库有不同的版本,但我认为您不会那么认真地使用它,嗯?
发布于 2012-03-05 05:01:47
如果有一种方法可以区分软件包名称是否是系统软件包,那么它将完美地完成这项工作。
不,没有百分之百确定的方法来区分哪些是系统包。包java。和javax。是保留的,应该只作为“系统”包使用,但没有什么能阻止你违反这条规则。另外,不同的JDK都有自己的实现包,例如用于sun/oracle JDK的com.sun。那么下一个问题将是在您可能使用的其他库中定义的包。
有没有办法过滤这些包,只保留我定义的包?
相反,这要容易得多,只需在中过滤您自己的包(很可能您使用的是普通的包命名策略,并且不会有重叠)。
https://stackoverflow.com/questions/9558682
复制相似问题