11/*
2- * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
2+ * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
33 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44 *
55 * This code is free software; you can redistribute it and/or modify it
2020 * or visit www.oracle.com if you need additional information or have any
2121 * questions.
2222 */
23- import jdk .internal .org .objectweb .asm .ClassReader ;
24- import jdk .internal .org .objectweb .asm .ClassVisitor ;
25- import jdk .internal .org .objectweb .asm .ClassWriter ;
26- import jdk .internal .org .objectweb .asm .MethodVisitor ;
27- import jdk .internal .org .objectweb .asm .Opcodes ;
2823
24+ import java .lang .classfile .ClassFile ;
25+ import java .lang .classfile .MethodModel ;
2926import java .lang .instrument .ClassFileTransformer ;
3027import java .lang .instrument .Instrumentation ;
3128import java .security .ProtectionDomain ;
@@ -37,34 +34,31 @@ public class HeadlessMalfunctionAgent {
3734
3835 public static void premain (String agentArgs , Instrumentation inst ) {
3936 inst .addTransformer (new ClassFileTransformer () {
40-
4137 @ Override
42- public byte [] transform (ClassLoader loader , String className , Class <?> classBeingRedefined ,
43- ProtectionDomain pd , byte [] cb ) {
44- if ("java/awt/GraphicsEnvironment" .equals (className )) {
45- System .out .println ("Transforming java.awt.GraphicsEnvironment." );
46- try {
47- final ClassReader cr = new ClassReader (cb );
48- final ClassWriter cw = new ClassWriter (cr , 0 );
49- cr .accept (new ClassVisitor (Opcodes .ASM9 , cw ) {
50-
51- @ Override
52- public MethodVisitor visitMethod (int access , String name , String descriptor , String signature ,
53- String [] exceptions ) {
54- if ("isHeadless" .equals (name ) && "()Z" .equals (descriptor )) {
55- System .out .println ("isHeadless removed from java.awt.GraphicsEnvironment." );
56- // WHACK! Remove the isHeadless method.
57- return null ;
58- }
59- return super .visitMethod (access , name , descriptor , signature , exceptions );
38+ public byte [] transform (ClassLoader loader ,
39+ String className ,
40+ Class <?> classBeingRedefined ,
41+ ProtectionDomain pd ,
42+ byte [] cb ) {
43+ if (!"java/awt/GraphicsEnvironment" .equals (className )) {
44+ return null ;
45+ }
46+ System .out .println ("Transforming java.awt.GraphicsEnvironment." );
47+ try {
48+ return ClassFile .of ().transformClass (ClassFile .of ().parse (cb ), (classBuilder , element ) -> {
49+ if (element instanceof MethodModel method ) {
50+ if ("isHeadless" .equals (method .methodName ().stringValue ()) &&
51+ "()Z" .equals (method .methodType ().stringValue ())) {
52+ System .out .println ("isHeadless removed from java.awt.GraphicsEnvironment." );
53+ return ;
6054 }
61- }, 0 );
62- return cw .toByteArray ();
63- } catch (Exception e ) {
64- e .printStackTrace ();
65- }
55+ }
56+ classBuilder .with (element );
57+ });
58+ } catch (Exception e ) {
59+ e .printStackTrace ();
60+ return null ;
6661 }
67- return null ;
6862 }
6963 });
7064 }
0 commit comments