package org.stagemonitor.core.instrument;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import net.bytebuddy.agent.ByteBuddyAgent;
class EhCacheAttachmentProvider implements ByteBuddyAgent.AttachmentProvider {
private Class<?> virtualMachineClass = null;
public EhCacheAttachmentProvider() {
try {
final Class<?> ehcacheAgentLoader = Class.forName("net.sf.ehcache.pool.sizeof.AgentLoader");
// ehcache found, get virtual machine class from ehcache to work around
// java.lang.UnsatisfiedLinkError: Native Library /usr/java/jdk1.8.0_40/jre/lib/amd64/libattach.so already loaded in another classloader
final Field virtual_machine_attach = ehcacheAgentLoader.getDeclaredField("VIRTUAL_MACHINE_ATTACH");
virtual_machine_attach.setAccessible(true);
virtualMachineClass = ((Method) virtual_machine_attach.get(null)).getDeclaringClass();
} catch (Exception e) {
// EhCache is not available
}
}
@Override
public Accessor attempt() {
return new Accessor() {
@Override
public boolean isAvailable() {
return virtualMachineClass != null;
}
@Override
public Class<?> getVirtualMachineType() {
return virtualMachineClass;
}
};
}
}