Java源炸弹(像拉链炸弹)

时间:2018-03-12 17:09:07

标签: java

我发现了关于Scala bomb (like a zip bomb)

的问题

我对同一个问题很感兴趣,但关于java

  

是否可以创建一个java源文件,在编译时,   产生大量的类文件(或非常大的单个类)   文件)?是否有任何方式类文件的大小可以增长得更快   与源文件的大小呈线性关系?

1 个答案:

答案 0 :(得分:0)

有一些技巧。但是没有办法制作最好的炸弹。您可能需要运行挑战才能找到一些好的条目。

codegolf.se 上有类似的一个:Build a Compiler Bomb

用户@Sleafar显示了Java变体:Java, 450 + 22 = 472 bytes source, ~1GB class file

以下是他的代码的副本:

import java.io.Writer;
import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;

@SupportedAnnotationTypes("java.lang.Override")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class B extends AbstractProcessor {
    @Override
    public boolean process(Set<? extends TypeElement> annotations,
            RoundEnvironment roundEnv) {
        if (annotations.size() > 0) {
            try (Writer writer = processingEnv.getFiler().createSourceFile("C")
                    .openWriter()) {
                writer.write("class C{int ");
                for (int i = 0; i < 16380; ++i) {
                    for (int j = 0; j < 65500; ++j) {
                        writer.write("i");
                    }
                    writer.write(i + ";int ");
                }
                writer.write("i;}");
            } catch (Exception e) {
            }
        }
        return true;
    }
}

如上所述,它使用Annotation Processors并需要两个编译过程:

javac B.java
javac -J-Xmx16G -processor B B.java

生成的类文件大约为1 GB

这个答案是社区维基,因为它只显示来自其他网站的另一个答案的副本。关闭投票是不合适的,因为在SO上没有类似的问题,它仍然是主题。