В методе 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)