- 文件中不能出现分号 "
;
"思考:此条件是说明语句不能结束?还是语句不需要结束?还是语法上可以没有分号?
- 文件中不能出现点号 "
.
"这样就避免了你直接使用
"System.out.print"
这一类的实现方式,连导包都不被允许。方法都不能调用?那用哪个包的 API ?怎么调用方法? - 文件中不能出现转义符 "
\
""
.
"号可以通过转义符"\u002E
"实现,这样就避免了你直接使用"System\u002Eout\u002Eprintln("Hello World!");"
这一类的实现方式。
思考: 常规输出 System.out.println()
中存在两个点,即便使用 lambda 方法引用也只能消除掉一个点,还有一个点去不掉。如果不能直接实现,那可以换个思路,这个类不能写,可以写在别的类中。
/**
* 目标类
*/
public class mmg {
static {
System.out.println("Hello World!");
}
}
import java.io.FileInputStream;
import java.util.Arrays;
/**
* Main
*/
public class Hello {
public static void main(String args[]) throws Exception {
//将获取的字符码文件通过 IO 流读取成 byte 数组并记录数组的内容
//读取目标class文件
FileInputStream f = new FileInputStream("mmg.class");
byte[] bytes = new byte[f.available()];
f.read(bytes);
System.out.println("字节码文件=" + Arrays.toString(bytes));
System.out.println("字节码文件的长度=" + bytes.length);
//可以通过类加载器ClassLoader 的 defineClass 方法实现。
//defineClass 方法要求传递的参数有类名、字节码对象的 byte 数组,从哪开始读取,数组长度。
//仍然可以通过匿名内部类和代码块的形式完成。通过 defineClass 创建字节码对象,
//并通过类加载静态代码块实现输出
if(new ClassLoader() {
{
try (AutoCloseable a = defineClass("mmg", bytes, 0, bytes.length)::newInstance) {
} catch (Exception e) {}
}
}==null){}
}
}
最终答案为:
public class Hello {
public static void main(String args[]) throws Exception {
if(new ClassLoader() {
{
try (AutoCloseable a = defineClass("mmg", new byte[]{
-54, -2, -70, -66, 0, 0, 0, 61, 0, 31, 10, 0,
2, 0, 3, 7, 0, 4, 12, 0, 5, 0, 6, 1, 0, 16, 106,
97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98,
106, 101, 99, 116, 1, 0, 6, 60, 105, 110, 105, 116,
62, 1, 0, 3, 40, 41, 86, 9, 0, 8, 0, 9, 7, 0, 10, 12,
0, 11, 0, 12, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97,
110, 103, 47, 83, 121, 115, 116, 101, 109, 1, 0, 3, 101,
114, 114, 1, 0, 21, 76, 106, 97, 118, 97, 47, 105, 111,
47, 80, 114, 105, 110, 116, 83, 116, 114, 101, 97, 109,
59, 8, 0, 14, 1, 0, 43, -23, -128, -102, -24, -65, -121,
-27, -83, -105, -24, -118, -126, -25, -96, -127, -26, -106,
-121, -28, -69, -74, -24, -66, -109, -27, -121, -70, -25,
-102, -124, 61, 72, 101, 108, 108, 111, 32, 87, 111, 114,
108, 100, 33, 10, 0, 16, 0, 17, 7, 0, 18, 12, 0, 19, 0, 20,
1, 0, 19, 106, 97, 118, 97, 47, 105, 111, 47, 80, 114, 105,
110, 116, 83, 116, 114, 101, 97, 109, 1, 0, 7, 112, 114, 105,
110, 116, 108, 110, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47,
108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41,
86, 7, 0, 22, 1, 0, 3, 109, 109, 103, 1, 0, 4, 67, 111, 100,
101, 1, 0, 15, 76, 105, 110, 101, 78, 117, 109, 98, 101, 114,
84, 97, 98, 108, 101, 1, 0, 18, 76, 111, 99, 97, 108, 86, 97,
114, 105, 97, 98, 108, 101, 84, 97, 98, 108, 101, 1, 0, 4, 116,
104, 105, 115, 1, 0, 5, 76, 109, 109, 103, 59, 1, 0, 8, 60, 99,
108, 105, 110, 105, 116, 62, 1, 0, 10, 83, 111, 117, 114, 99, 101,
70, 105, 108, 101, 1, 0, 8, 109, 109, 103, 46, 106, 97, 118, 97, 0,
33, 0, 21, 0, 2, 0, 0, 0, 0, 0, 2, 0, 1, 0, 5, 0, 6, 0, 1, 0, 23, 0,
0, 0, 47, 0, 1, 0, 1, 0, 0, 0, 5, 42, -73, 0, 1, -79, 0, 0, 0, 2,
0, 24, 0, 0, 0, 6, 0, 1, 0, 0, 0, 4, 0, 25, 0, 0, 0, 12, 0, 1, 0, 0,
0, 5, 0, 26, 0, 27, 0, 0, 0, 8, 0, 28, 0, 6, 0, 1, 0, 23, 0, 0, 0, 37,
0, 2, 0, 0, 0, 0, 0, 9, -78, 0, 7, 18, 13, -74, 0, 15, -79, 0, 0, 0, 1,
0, 24, 0, 0, 0, 10, 0, 2, 0, 0, 0, 6, 0, 8, 0, 7, 0, 1, 0, 29, 0, 0, 0,
2, 0, 30}, 0, 476)::newInstance) {
} catch (Exception e) {}
}
}==null){}
}
}