/
githubmirror
/
panama-vector
Обзор
Документация
Войти
/
githubmirror
/
panama-vector
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
test/jdk/java/lang/instrument/valhalla/RetransformValueClass.java
116 строк
4 KB
David Simms
8389219: Implement JEP 401: Value Objects (Preview)
31 июл 2026, 03:45
31 июл 2026, 03:45
cc278db
Код
Авторство
О чём код?
/* * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * @test * @summary Test for value class retransformation * * @library /test/lib * @modules java.instrument * @enablePreview * * @run main RetransformValueClass buildAgent * * @run main/othervm -javaagent:testAgent.jar RetransformValueClass */ import java.lang.instrument.Instrumentation; import java.lang.instrument.ClassFileTransformer; import java.security.ProtectionDomain; import jdk.test.lib.helpers.ClassFileInstaller; /* * The test verifies Instrumentation.retransformClasses() (and JVMTI function RetransformClasses) * works with value classes (i.e. JVMTI JvmtiClassFileReconstituter correctly restores class bytes). */ value class ValueClass { public int f1; public String f2; public ValueClass(int v1, String v2) { f1 = v1; f2 = v2; } } public class RetransformValueClass { public static void main (String[] args) throws Exception { if (args.length == 1 && "buildAgent".equals(args[0])) { buildAgent(); } else { runTest(); } } static void buildAgent() throws Exception { String manifest = "Premain-Class: RetransformValueClass\nCan-Redefine-Classes: true\nCan-Retransform-Classes: true\n"; ClassFileInstaller.writeJar("testAgent.jar", ClassFileInstaller.Manifest.fromString(manifest), "RetransformValueClass"); } // agent implementation static Instrumentation instrumentation; public static void premain(String agentArgs, Instrumentation inst) { instrumentation = inst; } // test implementation static final Class targetClass = ValueClass.class; static final String targetClassName = targetClass.getName(); static boolean transformToOriginalClassbytes = false; static void runTest() throws Exception { instrumentation.addTransformer(new Transformer(), true); instrumentation.retransformClasses(targetClass); transformToOriginalClassbytes = true; instrumentation.retransformClasses(targetClass); } static class Transformer implements ClassFileTransformer { public Transformer() { } public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) { if (className.equals(targetClassName)) { log("Transformer sees '" + className + "' of " + classfileBuffer.length + " bytes."); if (transformToOriginalClassbytes) { return classfileBuffer; } else { return null; } } return null; } } static void log(Object o) { System.out.println(String.valueOf(o)); } }