8008585: Better JMX data handling
Reviewed-by: alanb, dfuchs, jfdenise, skoivu, sjiang
This commit is contained in:
parent
9e0c698e00
commit
69718bb834
@ -39,6 +39,7 @@ import java.security.PrivilegedAction;
|
|||||||
|
|
||||||
import com.sun.jmx.remote.util.ClassLogger;
|
import com.sun.jmx.remote.util.ClassLogger;
|
||||||
import com.sun.jmx.remote.util.EnvHelp;
|
import com.sun.jmx.remote.util.EnvHelp;
|
||||||
|
import sun.reflect.misc.ReflectUtil;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -412,10 +413,10 @@ public class JMXConnectorFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static <T> T getProvider(JMXServiceURL serviceURL,
|
static <T> T getProvider(JMXServiceURL serviceURL,
|
||||||
Map<String, Object> environment,
|
final Map<String, Object> environment,
|
||||||
String providerClassName,
|
String providerClassName,
|
||||||
Class<T> targetInterface,
|
Class<T> targetInterface,
|
||||||
ClassLoader loader)
|
final ClassLoader loader)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
||||||
final String protocol = serviceURL.getProtocol();
|
final String protocol = serviceURL.getProtocol();
|
||||||
@ -425,11 +426,14 @@ public class JMXConnectorFactory {
|
|||||||
T instance = null;
|
T instance = null;
|
||||||
|
|
||||||
if (pkgs != null) {
|
if (pkgs != null) {
|
||||||
environment.put(PROTOCOL_PROVIDER_CLASS_LOADER, loader);
|
|
||||||
|
|
||||||
instance =
|
instance =
|
||||||
getProvider(protocol, pkgs, loader, providerClassName,
|
getProvider(protocol, pkgs, loader, providerClassName,
|
||||||
targetInterface);
|
targetInterface);
|
||||||
|
|
||||||
|
if (instance != null) {
|
||||||
|
boolean needsWrap = (loader != instance.getClass().getClassLoader());
|
||||||
|
environment.put(PROTOCOL_PROVIDER_CLASS_LOADER, needsWrap ? wrap(loader) : loader);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return instance;
|
return instance;
|
||||||
@ -442,6 +446,21 @@ public class JMXConnectorFactory {
|
|||||||
return serviceLoader.iterator();
|
return serviceLoader.iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static ClassLoader wrap(final ClassLoader parent) {
|
||||||
|
return parent != null ? AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
|
||||||
|
@Override
|
||||||
|
public ClassLoader run() {
|
||||||
|
return new ClassLoader(parent) {
|
||||||
|
@Override
|
||||||
|
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
|
||||||
|
ReflectUtil.checkPackageAccess(name);
|
||||||
|
return super.loadClass(name, resolve);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}) : null;
|
||||||
|
}
|
||||||
|
|
||||||
private static JMXConnector getConnectorAsService(ClassLoader loader,
|
private static JMXConnector getConnectorAsService(ClassLoader loader,
|
||||||
JMXServiceURL url,
|
JMXServiceURL url,
|
||||||
Map<String, ?> map)
|
Map<String, ?> map)
|
||||||
@ -552,5 +571,4 @@ public class JMXConnectorFactory {
|
|||||||
private static String protocol2package(String protocol) {
|
private static String protocol2package(String protocol) {
|
||||||
return protocol.replace('+', '.').replace('-', '_');
|
return protocol.replace('+', '.').replace('-', '_');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user