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