邪修 Java 10 连击|反射爆破单例、字节码改 JDK、Lambda 内联异常

编程狮(w3cschool.cn) 2025-08-07 11:33:05 浏览数 (153)
反馈

邪修 Java,10 段“千万别上生产”的黑魔法代码
——由编程狮(w3cschool.cn)出品,仅供猎奇

⚠️ 每条都踩红线:可读性 0、维护成本 ∞,面试可炫技,项目里敢用就等死。

1️⃣ 一行 Hello World(无分号、无 main)

class H{static{System.out.println("邪修Java");System.exit(0);}}

  • 运行javac H.java && java H
  • 原理<clinit> 静态块当入口,直接 System.exit 防止 JVM 继续初始化。

2️⃣ 用反射把 String 变可变

String s = "abc";
Field f = String.class.getDeclaredField("value");
f.setAccessible(true);
((char[]) f.get(s))[0] = 'A';
System.out.println(s); // 输出 Abc

破坏 final char[],常量池一起陪葬。

3️⃣ 宏替换式“泛型擦除”

import java.lang.reflect.*;
List<String> list = new ArrayList<>();
list.add("123");
Method m = List.class.getMethod("add", Object.class);
m.invoke(list, 42);        // 擦除后成功塞进 Integer
System.out.println(list);  // [123, 42]

编译期类型检查形同虚设。

4️⃣ 双重括号初始化“匿名派生”

List<Integer> li = new ArrayList<>() {{
    add(1); add(2); add(3);
}};

每用一次就偷偷创建匿名内部类,爆炸式内存泄漏。

5️⃣ 枚举单例 + 反射爆破

enum Singleton { INSTANCE; }
public static void main(String[] args) throws Exception {
    Constructor<Singleton> c = Singleton.class.getDeclaredConstructor(String.class,int.class);
    c.setAccessible(true);
    Singleton evil = c.newInstance("EVIL", 1);  // 破坏单例
}

枚举号称防反射?邪修眼里不存在的。

6️⃣ 字节码注入(Javassist 一行流)

ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("java.util.ArrayList");
cc.addMethod(CtNewMethod.make("public int size(){return 999;}", cc));
cc.toClass();
System.out.println(new ArrayList<>().size()); // 999

运行期改 JDK 源码,JVM 当场裂开。

7️⃣ 注解 + 反射 = 魔法路由

@Retention(RUNTIME) @interface Route { String value(); }
@Route("/hello") class HelloController { }


public static void invoke(String path) throws Exception {
    for (Class<?> c : Class.forName("").getClasses()) {
        if (c.isAnnotationPresent(Route.class) &&
            c.getAnnotation(Route.class).value().equals(path)) {
            c.getDeclaredConstructor().newInstance(); // 邪修式路由
        }
    }
}

0 行配置,全靠字符串比对,性能灾难。

8️⃣ 动态代理“偷天换日”

Map<String,Integer> map = (Map) Proxy.newProxyInstance(
        Map.class.getClassLoader(),
        new Class[]{Map.class},
        (proxy, method, args) -> "size".equals(method.getName()) ? 404 : null
);
System.out.println(map.size()); // 404

Map 接口秒变 404 页面。

9️⃣ 异常吞掉还能继续跑

try {
    int x = 1 / 0;
} catch (RuntimeException e) {
    throw new RuntimeException(new RuntimeException(e)); // 套娃异常
}

日志里 10 层 cause,定位直接崩溃。

🔟 终极一行:Lambda 内联异常

public static void main(String[] args) {
    ((Runnable)(() -> { throw new RuntimeException("boom"); })).run();
}

没有方法名,栈跟踪里只有两帧,调试器当场自闭。

邪修口诀

“Java 正道是 public static void main

邪修眼里万物皆可 static{}、反射、字节码。”

0 人点赞