1
1
/*
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.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
20
20
* or visit www.oracle.com if you need additional information or have any
21
21
* questions.
22
22
*/
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 ;
28
23
24
+ import java .lang .classfile .ClassFile ;
25
+ import java .lang .classfile .MethodModel ;
29
26
import java .lang .instrument .ClassFileTransformer ;
30
27
import java .lang .instrument .Instrumentation ;
31
28
import java .security .ProtectionDomain ;
@@ -37,34 +34,31 @@ public class HeadlessMalfunctionAgent {
37
34
38
35
public static void premain (String agentArgs , Instrumentation inst ) {
39
36
inst .addTransformer (new ClassFileTransformer () {
40
-
41
37
@ 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 ;
60
54
}
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 ;
66
61
}
67
- return null ;
68
62
}
69
63
});
70
64
}
0 commit comments