+ add dynamic classfiletransformer -> JBoss translator adaptor (since there isn't any in JBoss 5.0.x)
This commit is contained in:
Costin Leau 2009-11-12 02:28:42 +00:00
parent 155f6b1aa1
commit 1dc1d5ef9a
1 changed files with 10 additions and 17 deletions

View File

@ -16,8 +16,9 @@
package org.springframework.instrument.classloading.jboss;
import java.lang.instrument.ClassFileTransformer;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.springframework.util.Assert;
import org.springframework.util.ReflectionUtils;
@ -30,7 +31,6 @@ import org.springframework.util.ReflectionUtils;
*/
class JBossClassLoaderAdapter {
private static final String TRANSLATOR_ADAPTER_NAME = "org.jboss.classloader.spi.translator.ClassFileTransformer2Translator";
private static final String TRANSLATOR_NAME = "org.jboss.util.loading.Translator";
private static final String POLICY_NAME = "org.jboss.classloader.spi.base.BaseClassLoaderPolicy";
private static final String DOMAIN_NAME = "org.jboss.classloader.spi.base.BaseClassLoaderDomain";
@ -46,7 +46,8 @@ class JBossClassLoaderAdapter {
private static final String SET_TRANSLATOR_NAME = "setTranslator";
private final ClassLoader classLoader;
private final Constructor<?> constructor;
private final Class<?> translatorClass;
private final Method addTranslator;
private final Object target;
@ -81,7 +82,7 @@ class JBossClassLoaderAdapter {
// try the 5.1.x hooks
// check existence of BaseClassLoaderPolicy#addTranslator(Translator)
Class<?> translatorClass = classLoader.loadClass(TRANSLATOR_NAME);
this.translatorClass = classLoader.loadClass(TRANSLATOR_NAME);
Class<?> clazz = classLoader.loadClass(POLICY_NAME);
try {
addMethod = clazz.getDeclaredMethod(ADD_TRANSLATOR_NAME, translatorClass);
@ -102,25 +103,20 @@ class JBossClassLoaderAdapter {
method = clazz.getDeclaredMethod(GET_SYSTEM);
ReflectionUtils.makeAccessible(method);
Object system = method.invoke(domain);
addTarget = system;
// resolve ClassLoaderSystem
clazz = classLoader.loadClass(DEDICATED_SYSTEM);
Assert.isInstanceOf(clazz, system, "JBoss LoadTimeWeaver requires JBoss loader system of type "
+ clazz.getName() + " on JBoss 5.0.x");
// ClassLoaderSystem#setTranslator
addMethod = clazz.getDeclaredMethod(SET_TRANSLATOR_NAME, translatorClass);
addTarget = system;
}
this.addTranslator = addMethod;
this.target = addTarget;
// resolve Transformer2TranslatorUtil constructor
clazz = classLoader.loadClass(TRANSLATOR_ADAPTER_NAME);
this.constructor = clazz.getDeclaredConstructor(ClassFileTransformer.class);
} catch (Exception ex) {
throw new IllegalStateException(
"Could not initialize JBoss LoadTimeWeaver because the JBoss 5 API classes are not available", ex);
@ -128,15 +124,12 @@ class JBossClassLoaderAdapter {
}
public void addTransformer(ClassFileTransformer transformer) {
Object translator = null;
try {
translator = this.constructor.newInstance(transformer);
} catch (Exception ex) {
throw new IllegalStateException("Could not instantiate a JBoss class translator", ex);
}
InvocationHandler adapter = new JBossTranslatorAdapter(transformer);
Object adapterInstance = Proxy.newProxyInstance(this.translatorClass.getClassLoader(),
new Class[] { this.translatorClass }, adapter);
try {
addTranslator.invoke(target, translator);
addTranslator.invoke(target, adapterInstance);
} catch (Exception ex) {
throw new IllegalStateException("Could not add transformer on JBoss classloader " + classLoader, ex);
}