@@ -96,30 +96,40 @@ public static void premain(String args, Instrumentation instrumentation) throws
9696 }
9797
9898 public static void transformClasses () throws IOException {
99- transformClass ("org.apache.logging.log4j.core.appender.mom.JmsAppender" );
100- transformClass ("org.apache.logging.log4j.core.appender.mom.JmsAppender$1" );
101- transformClass ("org.apache.logging.log4j.core.appender.mom.JmsAppender$Builder" );
102- transformClass ("org.apache.logging.log4j.core.net.JndiManager" );
103- transformClass ("org.apache.logging.log4j.core.net.JndiManager$1" );
104- transformClass ("org.apache.logging.log4j.core.net.JndiManager$JndiManagerFactory" );
105- transformClass ("org.apache.logging.log4j.core.util.NetUtils" );
99+ transformClass ("org.apache.logging.log4j.core.appender.mom.JmsAppender" , false );
100+ transformClass ("org.apache.logging.log4j.core.appender.mom.JmsAppender$1" , false );
101+ transformClass ("org.apache.logging.log4j.core.appender.mom.JmsAppender$Builder" , false );
102+ transformClass ("org.apache.logging.log4j.core.net.JndiManager" , false );
103+ transformClass ("org.apache.logging.log4j.core.net.JndiManager$1" , false );
104+ transformClass ("org.apache.logging.log4j.core.net.JndiManager$JndiManagerFactory" , false );
105+ transformClass ("org.apache.logging.log4j.core.util.NetUtils" , false );
106+ if (Boolean .getBoolean ("log4j2Fix.loadReflectionUtil" )) {
107+ transformClass ("org.apache.logging.log4j.util.ReflectionUtil" , true );
108+ transformClass ("org.apache.logging.log4j.util.ReflectionUtil$PrivateSecurityManager" , true );
109+ }
106110 }
107111
108- public static void transformClass (String className ) throws IOException {
112+ public static void transformClass (String className , boolean loadNow ) throws IOException {
109113 Class <?> clazz = Arrays .stream (NativeUtil .getLoadedClasses ()).filter (clazz2 -> clazz2 .getTypeName ().equals (className )).findFirst ().orElse (null );
110114 if (clazz == null ) {
111115 String path = "/classes/" + className .replace ('.' , '/' ) + ".class" ;
112116 InputStream in = Log4j2Fix .class .getResourceAsStream (path );
113117 if (in == null ) throw new RuntimeException ("Could not find '" + path + "' in jar file" );
114118 byte [] newClassBytes = readAllBytes (in );
115- System .out .println (className + " is not loaded, registering class load hook" );
116- NativeUtil .registerClassLoadHook ((classLoader , s , aClass , protectionDomain , bytes ) -> {
117- if (s .equals (className .replace ('.' , '/' ))) {
118- System .out .println ("Transformed " + className );
119- return newClassBytes ;
120- }
121- return null ;
122- });
119+ if (loadNow ) {
120+ System .out .println ("Loading class " + className + " from " + path );
121+ Class <?> actualClass = NativeUtil .defineClass (className .replace ('.' , '/' ), ClassLoader .getSystemClassLoader (), newClassBytes , newClassBytes .length );
122+ System .out .println ("Loaded class '" + actualClass .toGenericString () + "' from " + path );
123+ } else {
124+ System .out .println (className + " is not loaded, registering class load hook" );
125+ NativeUtil .registerClassLoadHook ((classLoader , s , aClass , protectionDomain , bytes ) -> {
126+ if (s .equals (className .replace ('.' , '/' ))) {
127+ System .out .println ("Transformed " + className );
128+ return newClassBytes ;
129+ }
130+ return null ;
131+ });
132+ }
123133 } else {
124134 System .err .println (className + " is already loaded, cannot process " + className );
125135 }
0 commit comments