我可以将匿名或内部类编译成单个java .class文件吗?

时间:2009-06-10 00:55:44

标签: java file compiler-construction

我正在编写一个解析日志文件的Java类。需要将已编译的.class文件加载到第三方监视平台(eG)以进行部署和调用。不幸的是,第三方平台只允许我上传一个.class文件。

我当前的实现具有在符合文件掩码(* CJL * .log)的文件夹中查找“最新”文件的功能,并使用2个匿名类,一个用于过滤目录列表,另一个用于对列表进行排序基于ModifiedDt的文件。当我编译它时,我得到3个.class文件(Monitor.class,Monitor $ 1.class,Monitor $ 2.class),我无法部署。

是否可以将匿名类编译为单个.class文件以部署到第三方监控平台?

我附上了“查找最新文件”功能的代码以供说明。

private String FindLatestFile(String folderPath) {
    FilenameFilter filter = new FilenameFilter() {
        public boolean accept(File dir, String name) {
            if (name.endsWith(".log")
                    & name.contains("CJL")) 
                return true;
            else
                return false;
        }
    };

    File dir = new File(folderPath);

    File[] files = dir.listFiles(filter);

    if (files.length > 0) {
        Arrays.sort(files, new Comparator<File>() {
            public int compare(File f1, File f2) {
                return Long.valueOf(f1.lastModified()).compareTo(
                        f2.lastModified());
            }
        });

        File newest = files[files.length - 1];

        return newest.toString;
    } else {
        return "";
    }
}

我认为可以通过获取原始文件列表并自行进行过滤/排序来实现“哑”方式,但我担心这样做不会有效。

任何想法?

迈克尔

1 个答案:

答案 0 :(得分:4)

不可能是afaik。我假设一个罐子也不能使用。

解决方法是让类实现两个接口以消除对内部类的需要。

    class MyClass implements FilenameFilter, Comparator<File> {
    ...

    public boolean accept(File dir, String name) {
         if (name.endsWith(".log") & name.contains("CJL")) 
              return true;
         else
              return false;
    }

    public int compare(File f1, File f2) {
         return Long.valueOf(f1.lastModified()).compareTo(
                 f2.lastModified());
    }

    private String FindLatestFile(String folderPath) {

       File dir = new File(folderPath);

       File[] files = dir.listFiles(this);

       if (files.length > 0) {
            Arrays.sort(files, this);

            File newest = files[files.length - 1];

            return newest.toString;
       } else {
            return "";
       }
}