Java不用输出语句输出HelloWorld

  1. 文件中不能出现分号 ";"

    思考:此条件是说明语句不能结束?还是语句不需要结束?还是语法上可以没有分号?

  2. 文件中不能出现点号 "."

    这样就避免了你直接使用 "System.out.print" 这一类的实现方式,连导包都不被允许。方法都不能调用?那用哪个包的 API ?怎么调用方法?

  3. 文件中不能出现转义符 "\"

    "."号可以通过转义符"\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){}
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木芒果呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值