我已经知道如何获得所有可用的软件包,但是我只想获取我在自己的java项目中创建的软件包。
例如,我不希望java.util显示在包列表中。
我正在使用此代码来收集类:
List<String> result = new LinkedList<String>();
Package[] packages = Package.getPackages();
for(Package pack : packages)
{
result.add(pack.getName());
}
它的效果非常好,现在我只想摆脱所有的系统包。
有没有办法过滤包,只留下我定义的包?
PS,我并不担心效率,这个目的可能会慢得多,它只会在程序开始时运行一次。我已经看了几个相关的问题,但没有一个是我想要的。
如果有办法判断包名是否是系统包,那将完美地完成这项工作。
EDIT!
我将此作为API的一部分,因此我不能真正只是将包名称与设置令牌进行比较,看看它是否是我正在使用的包名称,我不希望它无论需要哪种编辑,只需将类文件放在我的项目中并使用它,无论我选择什么包名称。
我会尝试一种方法,无论它似乎不起作用,并给我随机错误,是扫描jar文件以检查是否存在与包名称等效的目录。每当我扫描jar文件时,我都会收到错误“无法访问jar文件,是否正由另一个进程使用?”。
扫描jar文件肯定会查看我的项目中是否存在类(jar文件),但另一个限制是我必须编译才能测试它,不能只在Eclipse中测试它,我编辑了代码10尝试让jar文件搜索工作,并且每次因为javaw.exe使用jar文件而导致访问错误时,它不允许我读取其中的文件。
EDIT2!
有人建议我列出所有已知系统类并将其与该列表进行比较,如果不同的JDK没有一些不同的类,这将有效,所以我想知道一个新的问题,有没有获取当前JRE系统库中所有jar文件的方法?然后我可以阅读这些内容并将所有包添加到过滤器中。
答案 0 :(得分:2)
If there is a way to tell if a package name is a system package, that will do the job perfectly.
不,没有100%可靠的方法来判断哪些是系统包。包java。和javax。是保留的,应该只用作“系统”包,但没有什么可以阻止你破坏该规则。不同的JDK也有自己的实现包,例如com.sun for sun / oracle JDK。然后,下一个问题将是您可能使用的其他库中定义的包。
有没有办法过滤包装,只有我自己的包装 定义了吗?
通过其他方式更容易,只需在您自己的包中进行过滤(很可能您使用的是正常的包命名策略,并且不会重叠)。
答案 1 :(得分:1)
我不知道这方面的任何方法......只是为了课程。
但是你可以通过运行来创建一个自己的列表,也许可以保存到自己程序中每个操作系统的文件中。
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-libraries但我不认为你想用那个严重的hm?