Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在“中查找所有包”;我的";项目_Java_Project_Packages - Fatal编程技术网

Java 在“中查找所有包”;我的";项目

Java 在“中查找所有包”;我的";项目,java,project,packages,Java,Project,Packages,我已经知道如何获取所有可用的包,但是我只尝试获取我在自己的java项目中制作的包 例如,我不希望java.util显示在包列表中 我使用以下代码来收集类: List<String> result = new LinkedList<String>(); Package[] packages = Package.getPackages(); for(Package pack : packages) { result.add(pack.getName()); }

我已经知道如何获取所有可用的包,但是我只尝试获取我在自己的java项目中制作的包

例如,我不希望java.util显示在包列表中

我使用以下代码来收集类:

List<String> result = new LinkedList<String>();

Package[] packages = Package.getPackages();

for(Package pack : packages)
{
    result.add(pack.getName());
}
List result=newlinkedlist();
Package[]packages=Package.getPackages();
用于(包装:包装)
{
add(pack.getName());
}
它工作得非常好,现在我只想去掉所有的系统包

有没有办法过滤这些包,以便只保留我定义的包

另外,我并不担心效率问题,它的目的是尽可能的慢,它只会在我的程序开始时运行一次

我已经看了几个相关的问题,但没有一个是我想要的

如果有一种方法可以判断包名是否是系统包,那么这将很好地完成这项工作

编辑

我把它作为API的一部分,因此我不能将包名与设置的标记进行比较,以确定它是否是我正在使用的包名,我不希望需要进行任何编辑,只需将类文件放在我的项目中并使用它,而不管我选择的包名是什么

我会尝试的一种方法是扫描jar文件,检查是否有与包名等效的目录,尽管它似乎不起作用,并且会给我随机错误。但每当我扫描jar文件时,就会出现错误“无法访问jar文件,它正在被另一个进程使用吗?”

扫描jar文件可以确定该类是否存在于我的项目(jar文件)中,但另一个限制是我必须编译来测试它,不能只在Eclipse中测试它,我编辑了代码10次,试图让jar文件搜索正常工作,每次都会出现访问错误,因为javaw.exe正在使用jar文件,所以不允许我读取其中的文件

编辑2

有人建议我列出所有已知的系统类,并将其与该列表进行比较,如果不同的JDK没有一些不同的类,这会起作用,所以我想知道一个新的问题,有没有办法获取当前JRE系统库中的所有jar文件?然后我可以通读它们,并将它们的所有包添加到过滤器中

不,没有100%确定的方法来区分哪些是系统包。包java。和javax。是保留的,应该只作为“系统”包使用,但没有任何东西可以阻止您违反该规则。不同的JDK也有自己的实现包,例如com.sun for sun/oracle JDK。然后,下一个问题将是在您可能使用的其他库中定义的包

有没有办法过滤这些包,这样我只需要 还有什么


另一种方法要简单得多,只需在中过滤您自己的包(很可能您使用的是正常的包命名策略,不会有重叠)。

我不知道有什么方法。。。只是为了上课。 但您可以通过运行此命令来创建自己的列表,也可以将其保存到自己程序中每个操作系统的文件中。

Package[] pa = Package.getPackages();
for (int i = 0; i < pa.length; i++) {
    Package p = pa[i];
    System.out.print("\"" + p.getName() + "\", ");
}
Package[]pa=Package.getPackages();
对于(int i=0;i
然后加载此列表并遍历其他程序中要筛选包的每个包

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++;
    }
}
String[]systemPackages=新字符串[]{};
Package[]pa=Package.getPackages();
int n=0;
对于(int i=0;i

所以你可以检查一下。。。当然有不同版本的java库,但我认为您不想使用它,因为hm?

如何区分系统包、第三个库包和您的包?您的所有包是否都有一个通用前缀,如backwards.url.package1,或任何其他唯一的架构?您能否定义一个可以匹配的参数列表?所以,如果你匹配你得到的每个包,并且只有在它适用的情况下,你才能使用它?我把它作为一个小API的一部分,这样我就可以在任何需要它的项目中使用这个类,在这种情况下是的,但在其他情况下不是的,我通过确保它不是从java开始的,对它进行了大量的过滤。或者javax。但是我不能过滤组织。和com。和网。等等,因为我最终可能需要使用它们。是的,我可以,但是我尝试筛选的很多包都是com。组织。和网。包,而不仅仅是java。和javax。包,如果包中没有com-org或net,那么过滤包将是一个非常糟糕的举动,如果我的项目具有相同的包基本名称。这样做的目的是成为我正在制作的API的一部分,这样我就可以将类放在我的项目中并使用它,而不必编辑我可能使用的参数。Package.getPackages()只返回包的子集,即调用该方法时类加载器已知的那些包。是的,我知道,我想的是某种方法来检查类名,看看它是否存在于我的项目中,我试图扫描jar文件,但它不断给我错误,因为“无法访问jar文件,它是否正在被另一个进程使用”,所以我不知道有些人是如何循环使用jar文件的
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++;
    }
}