简体   繁体   English

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

[英]How to know the class file names (including inner classes) that will generate after compiling a given java file?

I am working on some kind of software delivery tool. 我正在开发某种软件交付工具。 For one of its task the program needs to find the class file names which will generate after compiling any given java file. 对于程序的一项任务,程序需要找到将在编译任何给定的Java文件后生成的类文件名。

I need some kind of parsing library/approach which can detect all inner classes(named as well as anonymous) too. 我需要某种解析库/方法,它也可以检测所有内部类(命名和匿名)。

eg: If input file contains below code. 例如:如果输入文件包含以下代码。 Our program should generate output as: SampleClass1.class, SampleClass1$Data.class, SampleClass1$1.class 我们的程序应生成如下输出: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);
    }
}

If your program are running under Eclipse, JDT API ( org.eclipse.jdt.core plugin) is a choice. 如果您的程序在Eclipse下运行,则可以选择JDT APIorg.eclipse.jdt.core插件)。 Here is a example: 这是一个例子:

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());
                }
            }
        }
    }
}

Output example: 输出示例:

SampleClass1 SampleClass1

SampleClass1$Data SampleClass1 $ Data

SampleClass1$1 SampleClass1 $ 1

The JDT core API doesn't handle naming of anonymous types. JDT核心API不处理匿名类型的命名。 If private void printList(List list) also include a anonymous type. 如果private void printList(List list)也包含匿名类型。 The API also return SampleClass1$1 . 该API还返回SampleClass1 $ 1

You may also need czs[i].getFields() to find anonymous type inside Field. 您可能还需要czs[i].getFields()在Field中查找匿名类型。 If SampleClass1 declare a class variable like: 如果SampleClass1声明一个类变量,例如:

Runnable r = new Runnable() {
    public void run(){};
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM