Создание пользовательского загрузчика классов с помощью javaagent создает исключение AccessControlException в WebSphere 8.5 - PullRequest
0 голосов
/ 02 октября 2019

В методе transform моего javaagent я создаю собственный загрузчик классов. Этот код прекрасно работает во всех веб-контейнерах (включая webSphere liberty), но выдает AccessControlException в WebSphere 8.5. Что я могу сделать, чтобы решить эту проблему?

Я пытался использовать SecurityManager с предоставлением allPermissions, который работает для WebSphere 8.5, но другим контейнерам, таким как JBoss и WebSphere liberty, это не нравится.

public byte[] transform(final ClassLoader loader, String className,     Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {

  JarFile myJar = null;

  Method defineClass = ClassLoader.class.getDeclaredMethod(   "defineClass", new Class[]{ String.class, byte[].class, int.class, int.class } );

  defineClass.setAccessible( true );

  // reads raw bytes of the class from the jar file
  byte[] loaderDef = readBytes( myJar,"com/mypkg/CustomClassLoader.class" );

  // THIS IS WHERE THE EXCEPTION GETS THROWN
  defineClass.invoke( loader, "com.mypkg.CustomClassLoader", loaderDef, 0, loaderDef.length );

}


public class CustomClassLoader extends ClassLoader {
        private final ClassLoader parent;  
        private final ClassLoader myCL;

 public CustomClassLoader( ClassLoader parent, ClassLoader cl ) {
            this.parent = parent;
            this.myCL = cl;
        }

}

Это исключение, выброшенное WebSphere8,5. Я ожидал, что это не должно быть выброшено вообще как другие контейнеры.

InvocationTargetException caught trying to invoke defineClass.
java.security.AccessControlException: Access denied ("java.lang.RuntimePermission" "createClassLoader")
        at java.security.AccessController.throwACE(AccessController.java:157)
        at java.security.AccessController.checkPermissionHelper(AccessController.java:217)
        at java.security.AccessController.checkPermission(AccessController.java:349)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:562)
        at java.lang.SecurityManager.checkCreateClassLoader(SecurityManager.java:624)
        at java.lang.ClassLoader.<init>(ClassLoader.java:216)
        at java.lang.ClassLoader.<init>(ClassLoader.java:197)
        at com.mypkg.CustomClassLoader.<init>(CustomClassLoader.java:23)
...