誰もがすぐに 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)