邪修 Java,10 段“千萬(wàn)別上生產(chǎn)”的黑魔法代碼
——由編程獅(w3cschool.cn)出品,僅供獵奇
?? 每條都踩紅線:可讀性 0、維護(hù)成本 ∞,面試可炫技,項(xiàng)目里敢用就等死。
1?? 一行 Hello World(無(wú)分號(hào)、無(wú) main)
class H{static{System.out.println("邪修Java");System.exit(0);}}
- 運(yùn)行:
javac H.java && java H
- 原理:
<clinit>
靜態(tài)塊當(dāng)入口,直接System.exit
防止 JVM 繼續(xù)初始化。
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); // 擦除后成功塞進(jìn) Integer
System.out.println(list); // [123, 42]
編譯期類型檢查形同虛設(shè)。
4?? 雙重括號(hào)初始化“匿名派生”
List<Integer> li = new ArrayList<>() {{
add(1); add(2); add(3);
}};
每用一次就偷偷創(chuàng)建匿名內(nèi)部類,爆炸式內(nèi)存泄漏。
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); // 破壞單例
}
枚舉號(hào)稱防反射?邪修眼里不存在的。
6?? 字節(jié)碼注入(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
運(yùn)行期改 JDK 源碼,JVM 當(dāng)場(chǎng)裂開。
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 行配置,全靠字符串比對(duì),性能災(zāi)難。
8?? 動(dòng)態(tài)代理“偷天換日”
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 頁(yè)面。
9?? 異常吞掉還能繼續(xù)跑
try {
int x = 1 / 0;
} catch (RuntimeException e) {
throw new RuntimeException(new RuntimeException(e)); // 套娃異常
}
日志里 10 層 cause,定位直接崩潰。
?? 終極一行:Lambda 內(nèi)聯(lián)異常
public static void main(String[] args) {
((Runnable)(() -> { throw new RuntimeException("boom"); })).run();
}
沒(méi)有方法名,棧跟蹤里只有兩幀,調(diào)試器當(dāng)場(chǎng)自閉。
邪修口訣
“Java 正道是
public static void main
,
邪修眼里萬(wàn)物皆可static{}
、反射、字節(jié)碼?!?/p>