Java 类java.lang.instrument.Instrumentation 实例源码
项目:openrasp
文件:Agent.java
/**
* 初始化类字节码的转换器
*
* @param inst 用于管理字节码转换器
*/
private static void initTransformer(Instrumentation inst) throws UnmodifiableClassException {
LinkedList<Class> retransformClasses = new LinkedList<Class>();
CustomClassTransformer customClassTransformer = new CustomClassTransformer();
inst.addTransformer(customClassTransformer, true);
Class[] loadedClasses = inst.getAllLoadedClasses();
for (Class clazz : loadedClasses) {
for (final AbstractClassHook hook : customClassTransformer.getHooks()) {
if (hook.isClassMatched(clazz.getName().replace(".", "/"))) {
if (inst.isModifiableClass(clazz) && !clazz.getName().startsWith("java.lang.invoke.LambdaForm")) {
retransformClasses.add(clazz);
}
}
}
}
// hook已经加载的类
Class[] classes = new Class[retransformClasses.size()];
retransformClasses.toArray(classes);
if (classes.length > 0) {
inst.retransformClasses(classes);
}
}
项目:openrasp
文件:Agent.java
/**
* 启动时加载的agent入口方法
*
* @param agentArg 启动参数
* @param inst {@link Instrumentation}
*/
public static void premain(String agentArg, Instrumentation inst) {
try {
JarFileHelper.addJarToBootstrap(inst);
if (!loadConfig(JarFileHelper.getLocalJarParentPath())) {
return;
}
readVersion();
// 初始化插件系统
JsPluginManager.init();
CheckerManager.init();
initTransformer(inst);
String message = "OpenRasp Initialized [" + projectVersion + " (build: GitCommit=" + gitCommit + " date="
+ buildTime + ")]";
System.out.println(message);
Logger.getLogger(Agent.class.getName()).info(message);
HookHandler.enableHook.set(true);
} catch (Exception e) {
System.out.println("[OpenRASP] Failed to initialize, will continue without security protection.");
e.printStackTrace();
}
}
项目:cassandra-prometheus
文件:Exporter.java
public static void premain(String agentArg, Instrumentation inst)
{
String[] args = agentArg.split(":");
if (args.length > 2) {
System.err.println(USAGE);
}
int port = 7400;
try {
port = Integer.parseInt(args[0]);
} catch(Exception e) {
System.err.println(USAGE + ". No port specified so using default port for cassandra prometheus exporter " + port);
}
String path = "metrics";
if (args.length == 2) {
if (args[1].length() > 0) {
path = args[1];
} else {
System.err.println(USAGE + ". Invalid path defined so using default path for cassandra prometheus exporter: " + path);
}
}
PrometheusExporter exp = new PrometheusExporter(port, path);
}
项目:jvm-sandbox
文件:JettyCoreServer.java
private void initManager(final Instrumentation inst,
final CoreConfigure cfg) {
logger.debug("{} was init", EventListenerHandlers.getSingleton());
final ModuleLifeCycleEventBus moduleLifeCycleEventBus = new DefaultModuleLifeCycleEventBus();
final LoadedClassDataSource classDataSource = new DefaultLoadedClassDataSource(inst);
final ClassLoader sandboxClassLoader = getClass().getClassLoader();
// 初始化模块资源管理器
this.moduleResourceManager = new DefaultModuleResourceManager();
moduleLifeCycleEventBus.append(this.moduleResourceManager);
// 初始化服务管理器
final ProviderManager providerManager = new DefaultProviderManager(cfg, sandboxClassLoader);
// 初始化模块管理器
this.coreModuleManager = new DefaultCoreModuleManager(
inst, classDataSource, cfg, sandboxClassLoader, moduleLifeCycleEventBus, providerManager
);
}
项目:openjdk-jdk10
文件:RedefineMethodInBacktraceAgent.java
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("Hello from RedefineMethodInBacktraceAgent!");
System.out.println("isRedefineClassesSupported()=" +
inst.isRedefineClassesSupported());
instrumentation = inst;
}
项目:openjdk-jdk10
文件:TestLambdaFormRetransformation.java
public static void premain(String args, Instrumentation instrumentation) {
if (!instrumentation.isRetransformClassesSupported()) {
System.out.println("Class retransformation is not supported.");
return;
}
System.out.println("Calling lambda to ensure that lambda forms were created");
Agent.lambda.run();
System.out.println("Registering class file transformer");
instrumentation.addTransformer(new Agent());
for (Class c : instrumentation.getAllLoadedClasses()) {
if (c.getName().contains("LambdaForm") &&
instrumentation.isModifiableClass(c)) {
System.out.format("We've found a modifiable lambda form: %s%n", c.getName());
try {
instrumentation.retransformClasses(c);
} catch (UnmodifiableClassException e) {
throw new AssertionError("Modification of modifiable class " +
"caused UnmodifiableClassException", e);
}
}
}
}
项目:openjdk-jdk10
文件:RedefineModuleTest.java
/**
* Use redefineModule to update java.base to read java.instrument
*/
public void testAddReads() {
Module baseModule = Object.class.getModule();
Module instrumentModule = Instrumentation.class.getModule();
// pre-conditions
assertFalse(baseModule.canRead(instrumentModule));
// update java.base to read java.instrument
Set<Module> extraReads = Set.of(instrumentModule);
redefineModule(baseModule, extraReads, Map.of(), Map.of(), Set.of(), Map.of());
assertTrue(baseModule.canRead(instrumentModule));
}
项目:jvm-sandbox
文件:AgentLauncher.java
/**
* 动态加载
*
* @param featureString 启动参数
* [namespace,token,ip,port,prop]
* @param inst inst
*/
public static void agentmain(String featureString, Instrumentation inst) {
LAUNCH_MODE = LAUNCH_MODE_ATTACH;
final Map<String, String> featureMap = toFeatureMap(featureString);
writeAttachResult(
getNamespace(featureMap),
getToken(featureMap),
main(featureMap, inst)
);
}
项目:marathonv5
文件:JavaFxRecorderHook.java
public static void premain(final String args, Instrumentation instrumentation) throws Exception {
instrumentation.addTransformer(new MenuItemTransformer());
instrumentation.addTransformer(new FileChooserTransformer());
logger.info("JavaVersion: " + System.getProperty("java.version"));
final int port;
if (args != null && args.trim().length() > 0) {
port = Integer.parseInt(args.trim());
} else {
throw new Exception("Port number not specified");
}
windowTitle = System.getProperty("start.window.title", "");
ObservableList<Stage> stages = StageHelper.getStages();
stages.addListener(new ListChangeListener<Stage>() {
boolean done = false;
@Override public void onChanged(javafx.collections.ListChangeListener.Change<? extends Stage> c) {
if (done) {
return;
}
if (!"".equals(windowTitle)) {
logger.warning("WindowTitle is not supported yet... Ignoring it.");
}
c.next();
if (c.wasAdded()) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
@Override public Object run() {
return new JavaFxRecorderHook(port);
}
});
done = true;
}
}
});
}
项目:promagent
文件:Promagent.java
public static void premain(String agentArgs, Instrumentation inst) {
try {
PromagentCollectorRegistry registry = new PromagentCollectorRegistry();
ManagementFactory.getPlatformMBeanServer().registerMBean(new Exporter(registry), new ObjectName("io.promagent:type=exporter"));
Map<String, String> args = parseCmdline(agentArgs);
if (args.containsKey("port")) {
BuiltInServer.run(args.get("host"), args.get("port"), registry);
}
ClassLoaderCache classLoaderCache = ClassLoaderCache.getInstance();
List<Path> hookJars = classLoaderCache.getPerDeploymentJars();
SortedSet<HookMetadata> hookMetadata = new HookMetadataParser(hookJars).parse();
MetricsStore metricsStore = new MetricsStore(registry);
Delegator.init(hookMetadata, metricsStore, classLoaderCache);
printHookMetadata(hookMetadata);
AgentBuilder agentBuilder = new AgentBuilder.Default()
.with(AgentBuilder.RedefinitionStrategy.REDEFINITION)
.with(AgentBuilder.TypeStrategy.Default.REDEFINE);
// .with(AgentBuilder.Listener.StreamWriting.toSystemError()); // use this to see exceptions thrown in instrumented code
agentBuilder = applyHooks(agentBuilder, hookMetadata, classLoaderCache);
agentBuilder.installOn(inst);
// TODO -- the following is an experiment supporting collectors directly (in addition to hooks)
// io.prometheus.client.Collector jmxCollector = (io.prometheus.client.Collector) classLoaderCache.currentClassLoader().loadClass("io.promagent.collectors.JmxCollector").newInstance();
// registry.registerNoJmx(jmxCollector);
} catch (Throwable t) {
t.printStackTrace();
}
}
项目:authlib-injector
文件:AuthlibInjectorPremain.java
public static void premain(String arg, Instrumentation instrumentation) {
try {
log("launched from javaagent");
if (arg != null && !arg.isEmpty()) {
System.setProperty("org.to2mbn.authlibinjector.config", arg);
}
bootstrap(instrumentation::addTransformer);
} catch (Throwable e) {
// prevent the exception being thrown to VM
e.printStackTrace();
}
}
项目:shabdiz
文件:Bootstrap.java
public static void premain(final String args, final Instrumentation instrumentation) throws Exception {
final BootstrapConfiguration configuration = getConfigurationFromFile();
loadMavenArtifacts(instrumentation, configuration);
loadClassPathFiles(instrumentation, configuration.files);
loadClassPathUrlsAsString(instrumentation, configuration.urls);
loadShutdownHooks(configuration);
loadApplicationBootstrapClassName(configuration);
}
项目:shabdiz
文件:Bootstrap.java
private static void loadMavenArtifacts(final Instrumentation instrumentation, final BootstrapConfiguration configuration) throws Exception {
if (configuration.hasMavenArtifact()) {
initMavenDependencyResolver(instrumentation);
addMavenRepositories(configuration.maven_repositories);
resolveAndLoadMavenArtifacts(instrumentation, configuration.maven_artifacts);
}
}
项目:jvm-sandbox
文件:DefaultCoreModuleManager.java
/**
* 模块模块管理
*
* @param inst inst
* @param classDataSource 已加载类数据源
* @param cfg 模块核心配置
* @param sandboxClassLoader 沙箱加载ClassLoader
* @param moduleLifeCycleEventBus 模块生命周期通知总线
* @param providerManager 服务提供者管理器
*/
public DefaultCoreModuleManager(final Instrumentation inst,
final LoadedClassDataSource classDataSource,
final CoreConfigure cfg,
final ClassLoader sandboxClassLoader,
final ModuleLifeCycleEventBus moduleLifeCycleEventBus,
final ProviderManager providerManager) {
this.inst = inst;
this.classDataSource = classDataSource;
this.cfg = cfg;
this.sandboxClassLoader = sandboxClassLoader;
this.moduleLifeCycleEventBus = moduleLifeCycleEventBus;
this.providerManager = providerManager;
// 初始化模块目录
this.moduleLibDirArray = mergeFileArray(
new File[]{new File(cfg.getSystemModuleLibPath())},
cfg.getUserModuleLibFilesWithCache()
);
// 初始化加载所有的模块
try {
reset();
} catch (ModuleException e) {
logger.warn("init module[id={};] occur error={}.", e.getUniqueId(), e.getErrorCode(), e);
}
}
项目:openjdk-jdk10
文件:ManifestTestAgent.java
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("Hello from ManifestTestAgent!");
System.out.println("isNativeMethodPrefixSupported()=" +
inst.isNativeMethodPrefixSupported());
System.out.println("isRedefineClassesSupported()=" +
inst.isRedefineClassesSupported());
System.out.println("isRetransformClassesSupported()=" +
inst.isRetransformClassesSupported());
}
项目:openjdk-jdk10
文件:RedefineMethodDelInvokeAgent.java
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("Hello from RedefineMethodDelInvokeAgent!");
System.out.println("isRedefineClassesSupported()=" +
inst.isRedefineClassesSupported());
instrumentation = inst;
}
项目:openjdk-jdk10
文件:AddModuleReadsTest.java
public static void main(String args[]) {
Module unnamed = AddModuleReadsTest.class.getClassLoader().getUnnamedModule();
Module base = Object.class.getModule();
Module instrument = Instrumentation.class.getModule();
int status = check(unnamed, base, instrument);
if (status != 0) {
throw new RuntimeException("Non-zero status returned from the agent: " + status);
}
}
项目:openjdk-jdk10
文件:RedefineClassWithNativeMethodAgent.java
public static void premain(String agentArgs, final Instrumentation inst) throws Exception {
String s = agentArgs.substring(0, agentArgs.indexOf(".class"));
clz = Class.forName(s.replace('/', '.'));
InputStream in;
Module m = clz.getModule();
if (m != null) {
in = m.getResourceAsStream(agentArgs);
} else {
ClassLoader loader =
RedefineClassWithNativeMethodAgent.class.getClassLoader();
in = loader.getResourceAsStream(agentArgs);
}
if (in == null) {
throw new Exception("Cannot find class: " + agentArgs);
}
byte[] buffer = in.readAllBytes();
new Timer(true).schedule(new TimerTask() {
public void run() {
try {
System.out.println("Instrumenting");
ClassDefinition cld = new ClassDefinition(clz, buffer);
inst.redefineClasses(new ClassDefinition[] { cld });
}
catch (Exception e) { e.printStackTrace(); }
}
}, 500);
}
项目:jvm-sandbox
文件:DefaultModuleEventWatcher.java
DefaultModuleEventWatcher(final Instrumentation inst,
final LoadedClassDataSource classDataSource,
final CoreModule coreModule,
final boolean isEnableUnsafe) {
this.inst = inst;
this.classDataSource = classDataSource;
this.coreModule = coreModule;
this.isEnableUnsafe = isEnableUnsafe;
}
项目:JInsight
文件:Agent.java
public static void premain(String agentArgs, Instrumentation instrumentation) throws Exception {
main0(agentArgs, instrumentation, (a, i) -> {
try {
Main.premain(a, i);
} catch (Exception e) {
throw new AgentInitializationException(e);
}
});
}
项目:JInsight
文件:Agent.java
public static void agentmain(String agentArgs, Instrumentation instrumentation) throws Exception {
main0(agentArgs, instrumentation, (a, i) -> {
try {
Main.agentmain(a, i);
} catch (Exception e) {
throw new AgentInitializationException(e);
}
});
}
项目:JInsight
文件:Agent.java
private static void main0(String agentArgs, Instrumentation instrumentation,
BiConsumer<String, Instrumentation> delegate) {
if (ClassLoader.getSystemResource(BTM_SCRIPTS_RESOURCE_PATH) == null) {
System.err.println("Could not load " + BTM_SCRIPTS_RESOURCE_PATH + "."
+ "Agent will not be started.");
return;
}
try {
ConfigService.initialize();
} catch (ConfigurationException | IOException | RuntimeException e) {
System.err.println(e.getMessage());
System.err.println("Agent will not be started.");
return;
}
if (agentArgs != null && agentArgs.trim().length() > 0) {
agentArgs += "," + AGENT_PARAMS;
} else {
agentArgs = AGENT_PARAMS;
}
JarFile bytemanJar = createBytemanJar();
if (bytemanJar == null) {
System.err.println("Could not locate: " + BYTEMAN_JAR_RESOURCE_NAME);
System.err.println("Agent will not be started.");
return;
}
instrumentation.appendToBootstrapClassLoaderSearch(bytemanJar);
delegate.accept(agentArgs, instrumentation);
}
项目:lams
文件:InstrumentationLoadTimeWeaver.java
/**
* Obtain the Instrumentation instance for the current VM, if available.
* @return the Instrumentation instance, or {@code null} if none found
* @see #isInstrumentationAvailable()
*/
private static Instrumentation getInstrumentation() {
if (AGENT_CLASS_PRESENT) {
return InstrumentationAccessor.getInstrumentation();
}
else {
return null;
}
}
项目:util4j
文件:MyAgent.java
public static void agentmain(String arg,Instrumentation inst) throws AttachNotSupportedException, IOException
{
MyAgent.inst=inst;
System.out.println("agent代理程序类[MyAgent]被执行!");
System.out.println("当前代理程序类使用加载器:"+Thread.currentThread().getContextClassLoader().toString());
num.incrementAndGet();
System.out.println(num.longValue());
System.out.println(arg);
Class<?>[] classes = inst.getAllLoadedClasses();
for(Class<?> cls :classes)
{
System.out.println(cls.getName());
}
}
项目:mjolnir
文件:Agent.java
public static void premain(String agentArgs, Instrumentation instrumentation) {
//public static void agentmain(String agentArgs, Instrumentation instrumentation) {
//System.out.println("agent started");
Agent.instrumentation = instrumentation;
instrumentation.addTransformer(new ClassFileTransformer() {
@Override
public byte[] transform(Module module, ClassLoader loader, String className, Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
//System.out.println("transform " + className + " " + classBeingRedefined);
if (classBeingRedefined == null) { // do not rewrite too early
return null;
}
Function<String, Optional<InputStream>> classFileFinder = internalName -> Optional.ofNullable(loader.getResourceAsStream(internalName + ".class"));
try {
return Rewriter.rewrite(new ByteArrayInputStream(classfileBuffer), classFileFinder);
} catch (IOException e) {
throw (IllegalClassFormatException)new IllegalClassFormatException().initCause(e);
}
}
}, true);
}
项目:mjolnir
文件:AgentFacadeImpl.java
private Instrumentation checkInstrumentation() {
Instrumentation instrumentation = Agent.instrumentation;
if (instrumentation == null) {
throw new IllegalStateException("no instrumentation");
}
return instrumentation;
}
项目:openjdk-jdk10
文件:InstrumentationHandoff.java
public static Instrumentation
getInstrumentationOrThrow()
{
Instrumentation result = getInstrumentation();
if ( result == null )
{
throw new NullPointerException("instrumentation instance not initialized");
}
return result;
}
项目:EvoMaster
文件:InstrumentingAgent.java
/**
* Actual method that is going to be called when the JavaAgent is started.
* This is called to init the JavaAgent when attached to an already running JVM.
*
* @param agentArgs in this case, the {@code packagePrefixesToCover}
* @param inst
*/
public static void agentmain(String agentArgs, Instrumentation inst) {
packagePrefixesToCover = agentArgs;
instrumentator = new Instrumentator(packagePrefixesToCover);
inst.addTransformer(new TransformerForTests());
active = true;
String port = System.getProperty(EXTERNAL_PORT_PROP);
if (port != null) {
SimpleLogger.info("Starting remote instrumenting Agent for packages: " + agentArgs);
AgentController.start(Integer.parseInt(port));
}
String sqlDriver = System.getProperty(SQL_DRIVER);
if (sqlDriver != null) {
SimpleLogger.info("Initializing P6SPY with base driver " + sqlDriver);
initP6Spy(sqlDriver);
}
String outputFile = System.getProperty(OUTPUT_FILE);
if(outputFile != null){
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
saveCoverageToDisk(outputFile);
}));
}
}
项目:sbiger-apm
文件:AgentBoot.java
/**
* 启动入口
* @param instrumentation
* @return
*/
public Agent start(Instrumentation instrumentation) {
new AgentBuilder.Default()
.type(
inPlugins().and(not(isInterface()))
)
.transform(((builder, typeDescription, classLoader, javaModule) -> {
ClassDataSource dataSource = pluginManager.find(typeDescription.getName());
//TODO 大有可为
return DataSourceMonitorRegister.register(dataSource, builder); //注册监听代码(拦截器)
}))
.with(listener())
.installOn(instrumentation);
return this;
}
项目:jvm-sandbox
文件:JettyCoreServer.java
@Override
public synchronized void bind(final CoreConfigure cfg, final Instrumentation inst) throws IOException {
try {
initializer.initProcess(new Initializer.Processor() {
@Override
public void process() throws Throwable {
// logger.info("prepare init sandbox start.");
initLogback(cfg);
logger.debug("init logback finished.");
logger.info("cfg={}", cfg.toString());
initManager(inst, cfg);
logger.debug("init resource finished.");
initHttpServer(cfg);
logger.debug("init http-server finished.");
initJettyContextHandler(cfg);
logger.debug("init servlet finished.");
httpServer.start();
logger.debug("http-server started.");
logger.info("sandbox start finished.");
}
});
} catch (Throwable cause) {
logger.warn("server bind failed. cfg={}", cfg, cause);
throw new IOException(
String.format("server bind to %s:%s failed.", cfg.getServerIp(), cfg.getServerPort()),
cause
);
}
logger.info("server bind to {} success. cfg={}", getLocal(), cfg);
}
项目:Recaf
文件:Agent.java
/**
* Populate {@link #instrument} and invoke Recaf.
*
* @param agentArgs
* @param inst
*/
private static void agent(String agentArgs, Instrumentation inst) {
instrument = inst;
if (agentArgs == null) {
agentArgs = "";
} else {
// TODO: Lets say for some reason the user wishes to edit some
// core-classes. They would want to set this boolean to false so
// core classes are loaded... But if this boolean is set to false,
// some wacky things happen.
// Screenshot of issue: https://my.mixtape.moe/tptxwl.jpg
// I have no idea why the instrumentation API is being such a child,
// but I don't know why this is happening.
if (agentArgs.equals("keep")) {
System.out.println(Recaf.class);
excludeInternals = false;
}
if (agentArgs.equals("keep2")) {
excludeInternals = false;
}
}
try {
// Add transformer and invoke retransform so already loaded classes
// are transformed.
ClassPopulator transformer = new ClassPopulator();
instrument.addTransformer(transformer, true);
instrument.retransformClasses(getModifable());
} catch (Throwable e) {
e.printStackTrace();
}
// Manually set params agent value.
// I keep getting mis-matched args via picoli when attaching to other
// processes.
LaunchParams params = new LaunchParams();
params.isAgent = true;
Recaf.start(new String[0], params);
}
项目:uavstack
文件:Iagent.java
public static void premain(String agentArgs, Instrumentation inst) {
String jarPath = "D:/creditRepository/ce-datamonitorsystem/com.creditease.uav.ttl/target/com.creditease.uav.ttl-2.1.0-agent.jar";
inst.addTransformer(new TtlTransformer());
try {
inst.appendToBootstrapClassLoaderSearch(new JarFile(jarPath));
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
项目:jdk8u-jdk
文件:InstrumentationHandoff.java
public static Instrumentation
getInstrumentationOrThrow()
{
Instrumentation result = getInstrumentation();
if ( result == null )
{
throw new NullPointerException("instrumentation instance not initialized");
}
return result;
}
项目:jdk8u-jdk
文件:RedefineMethodWithAnnotationsAgent.java
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("Hello from RedefineMethodWithAnnotationsAgent!");
System.out.println("isRedefineClassesSupported()=" +
inst.isRedefineClassesSupported());
instrumentation = inst;
}
项目:jdk8u-jdk
文件:RedefineMethodAddInvokeAgent.java
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("Hello from RedefineMethodAddInvokeAgent!");
System.out.println("isRedefineClassesSupported()=" +
inst.isRedefineClassesSupported());
instrumentation = inst;
}
项目:jdk8u-jdk
文件:RedefineMethodInBacktraceAgent.java
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("Hello from RedefineMethodInBacktraceAgent!");
System.out.println("isRedefineClassesSupported()=" +
inst.isRedefineClassesSupported());
instrumentation = inst;
}
项目:jdk8u-jdk
文件:ManifestTestAgent.java
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("Hello from ManifestTestAgent!");
System.out.println("isNativeMethodPrefixSupported()=" +
inst.isNativeMethodPrefixSupported());
System.out.println("isRedefineClassesSupported()=" +
inst.isRedefineClassesSupported());
System.out.println("isRetransformClassesSupported()=" +
inst.isRetransformClassesSupported());
}
项目:jdk8u-jdk
文件:RedefineSubclassWithTwoInterfacesAgent.java
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("Hello from " +
"RedefineSubclassWithTwoInterfacesAgent!");
System.out.println("isRedefineClassesSupported()=" +
inst.isRedefineClassesSupported());
instrumentation = inst;
}
项目:openjdk-jdk10
文件:RedefineSubclassWithTwoInterfacesAgent.java
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("Hello from " +
"RedefineSubclassWithTwoInterfacesAgent!");
System.out.println("isRedefineClassesSupported()=" +
inst.isRedefineClassesSupported());
instrumentation = inst;
}
项目:openjdk-jdk10
文件:ModifyAnonymous.java
public static void premain(String args, Instrumentation instrumentation) {
inst = instrumentation;
System.out.println("javaagent in da house!");
instrumentation.addTransformer(new LambdaTransformer());
}