0

每个人总是立即说 Class.forName,但这不是那个!!!

好的,所以我试图从网站上获取一堆文本并将其编译成一个类。到目前为止,我已经能够从网站上获取文本,但由于某种原因我无法定义它。

请看一下:

主类:(Driver.java)

public class Driver {
public static final Pattern packageDeclaration = Pattern.compile("package");

public static void main(String[] args) throws Exception {
    System.out.print("Enter the URL of the main class:  ");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String stringURL = br.readLine();
    String text = getURLText(new URL(stringURL));
    ByteClass mainClass = new ByteClass("Main", text.getBytes());
    mainClass.clazz.getMethod("run", null).invoke(mainClass.clazz, null);
}

public static String getURLText(URL url) throws IOException {
    StringBuilder lineGatherer = new StringBuilder();
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
    String line;
    while ((line = in.readLine()) != null) {
        lineGatherer.append(line);
    }
    in.close();
    return lineGatherer.toString();
}

}

和 ByteClass.java:

public class ByteClass {
private ArrayList<Byte> nonarraybytes = new ArrayList<Byte>();
public byte[] bytes;
public String[] lines;
public Class<?> clazz;

public ByteClass(String name, byte[] bytes) {
    for (byte b : bytes)
        nonarraybytes.add(b);
    bytes = new byte[nonarraybytes.size()];
    for (int i = 0; i < bytes.length; i++)
        bytes[i] = nonarraybytes.get(i);
    clazz = define(name, bytes);
}

protected Class<?> define(String name, byte[] bytes) {
    return new ClassLoader() {
        public Class<?> defineClass(String name, byte[] bytes) {
            return super.defineClass(name, bytes, 0, bytes.length);
        }
    }.defineClass(name, bytes);
}

}

所以,问题来了:

Enter the URL of the main class:  https://raw.github.com/JamesNorris/Ablockalypse/master/src/main/java/com/github/JamesNorris/Threading/FakeBeaconThread.java
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 1885430635 in class file Main
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at com.github.ByteClass$1.defineClass(ByteClass.java:134)
    at com.github.ByteClass.define(ByteClass.java:136)
    at com.github.ByteClass.<init>(ByteClass.java:21)
    at com.github.Driver.main(Driver.java:20)
4

3 回答 3

3

你从来没有真正编译过这个类;您正在尝试加载 Java 源代码 ( *.java),就好像它是一个类文件 ( *.class)。

为了解决这个问题,您需要在过程中的某个时间点调用 Java 编译器。最简单的方法是预先编译程序,然后将类文件放在您的网站上,而不是(或除了)源代码。

于 2013-04-07T00:19:10.020 回答
3

在某些时候,您必须使用编译器。好消息是您可以使用Java Compiler API从 Java 动态运行编译器。编译后你可以加载类并实例化它或做任何你想做的事情。

这里还有一些旧教程如何做到这一点。

于 2013-04-07T00:49:48.290 回答
1

您没有在 InputStream 中获得真正的 java 类,这就是代码抛出错误的原因。尝试记录您从 URL 接收到的输入,这会告诉您出了什么问题。

也看看这个问题,他和你面临同样的问题。

于 2013-04-07T00:16:19.047 回答