如何知道编译给定java文件后将生成的类文件名(包括内部类)?

如何知道编译给定java文件后将生成的类文件名(包括内部类)?,java,Java,我正在开发某种软件交付工具。对于其任务之一,程序需要找到编译任何给定java文件后将生成的类文件名 我需要某种解析库/方法,可以检测所有内部 类(命名和匿名)也是如此 e、 g:如果输入文件包含以下代码。我们的程序应该生成如下输出:SampleClass1.class、SampleClass1$Data.class、SampleClass1$1.class package com.aci.uob.patchmanifest.helper.testapp; import java.util.Ar

我正在开发某种软件交付工具。对于其任务之一,程序需要找到编译任何给定java文件后将生成的类文件名

我需要某种解析库/方法,可以检测所有内部 类(命名和匿名)也是如此

e、 g:如果输入文件包含以下代码。我们的程序应该生成如下输出:SampleClass1.class、SampleClass1$Data.class、SampleClass1$1.class

package com.aci.uob.patchmanifest.helper.testapp;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SampleClass1 {
    public static String CONSTANT_ATTR = "Sample String Constant";

    int attr;
    boolean b;

    private class Data implements Comparable<Data>{
        String val="--";

        public Data(String val) {
            super();
            this.val = val;
        }

        @Override
        public int compareTo(Data o) {
            return this.val.compareTo(o.val);
        }

    }

    public SampleClass1(int attr, boolean b) {
        super();
        System.out.println("this is a sample constructor");
        this.attr = attr;
        this.b = b;
    }


    private void runInnerClasses(){
        List<Data> list=new ArrayList<Data>();

        list.add(new Data("Hello"));
        list.add(new Data("World"));
        list.add(new Data("20"));
        list.add(new Data("100"));
        list.add(new Data(" Hello"));

        Collections.sort(list);

        printList(list);

        Collections.sort(list, new Comparator<Data>() {
            @Override
            public int compare(Data o1, Data o2) {
                // TODO Auto-generated method stub
                return o1.val.trim().compareToIgnoreCase(o2.val.trim());
            }

        });


    }


    private void printList(List<Data> list) {
        for(Data d: list)
            System.out.println(d.val);
    }
}
package com.aci.uob.patchmanifest.helper.testapp;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.Comparator;
导入java.util.List;
公共类样本类别1{
公共静态字符串常量\u ATTR=“示例字符串常量”;
int attr;
布尔b;
私有类数据实现了可比较的{
字符串val=“--”;
公共数据(字符串val){
超级();
this.val=val;
}
@凌驾
公共整数比较(数据o){
将此.val.compareTo返回到(o.val);
}
}
公共样本类别1(整数属性,布尔b){
超级();
System.out.println(“这是一个示例构造函数”);
this.attr=attr;
这个.b=b;
}
私有void runInnerClasses(){
列表=新的ArrayList();
添加(新数据(“Hello”);
列表。添加(新数据(“世界”);
增加(新数据(“20”));
增加(新数据(“100”));
添加(新数据(“Hello”);
集合。排序(列表);
打印列表(列表);
Collections.sort(list,newcomparator(){
@凌驾
公共整数比较(数据o1,数据o2){
//TODO自动生成的方法存根
返回o1.val.trim().CompareTignoreCase(o2.val.trim());
}
});
}
私有作废打印列表(列表){
用于(数据d:列表)
系统输出打印项次(d.val);
}
}

如果您的程序在Eclipse下运行,(
org.Eclipse.jdt.core
plugin)是一个选择。以下是一个例子:

IJavaElement ele = JavaCore.create(ifile);
if (ele instanceof ICompilationUnit) {
    IType[] czs = ((ICompilationUnit)ele).getAllTypes();
    for (int i = 0; i < czs.length; i++) {
        System.out.println(czs[i].getTypeQualifiedName());
        //IType.getFullyQualifiedName() will return value include package name
        IMethod[] ims = czs[i].getMethods();
        for (int j = 0; j < ims.length; j++) {
            IJavaElement[] childs = ims[j].getChildren();
            //find anonymous type inside Method
            for (int k = 0; k < childs.length; k++) {
                if (childs[k] instanceof IType) {
                    System.err.println(((IType)childs[k]).getTypeQualifiedName());
                }
            }
        }
    }
}

编译器当前生成的名称是什么?是@TimBiegeleisen,我必须找到java编译器在编译java文件时生成的名称。回到我的问题,你得到了什么名称?我认为尝试更改编译器对内部类的命名方式并不容易或可取。不,我不想更改类文件的名称。我需要类文件的名称来传递给其他一些模块,这些模块将用于不同的目的。我可以编译java文件,然后读取生成的*.class文件名;但我没有依赖类,因此使用这种方法会产生编译错误。谢谢@beckyang!你的回答很有解释性,但我正在寻找一个不同的解决方案。我必须在任何IDE之外独立运行这个程序。该程序将只接收一个java文件(或其全文内容),它应该生成类文件名,该类文件名将在java编译器编译后生成。我发现了一篇有用的文章:。在Eclipse之外使用JDTAPI不是问题。
Runnable r = new Runnable() {
    public void run(){};
};