This is an automated email from the ASF dual-hosted git repository. matthiasblaesing pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push: new 69c8d6331e Issue 4243: delete java/lang/Module and use dynamic proxy to implement Instrumentation across JDK versions new a1b803a832 Merge pull request #4273 from nbauma109/patch-4243 69c8d6331e is described below commit 69c8d6331e99d72d0d4c299a06c176e021e3187a Author: Nicolas Baumann <nicolas.bauma...@gmail.com> AuthorDate: Wed Jun 22 22:33:00 2022 +0200 Issue 4243: delete java/lang/Module and use dynamic proxy to implement Instrumentation across JDK versions --- platform/o.n.bootstrap/src/java/lang/Module.java | 23 ---- .../src/org/netbeans/NbInstrumentation.java | 134 ++++++++------------- 2 files changed, 47 insertions(+), 110 deletions(-) diff --git a/platform/o.n.bootstrap/src/java/lang/Module.java b/platform/o.n.bootstrap/src/java/lang/Module.java deleted file mode 100644 index 4b36b26142..0000000000 --- a/platform/o.n.bootstrap/src/java/lang/Module.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package java.lang; - -/** Dummy */ -public class Module { -} diff --git a/platform/o.n.bootstrap/src/org/netbeans/NbInstrumentation.java b/platform/o.n.bootstrap/src/org/netbeans/NbInstrumentation.java index 15b373136d..f4a95fc09d 100644 --- a/platform/o.n.bootstrap/src/org/netbeans/NbInstrumentation.java +++ b/platform/o.n.bootstrap/src/org/netbeans/NbInstrumentation.java @@ -26,6 +26,8 @@ import java.lang.instrument.Instrumentation; import java.lang.instrument.UnmodifiableClassException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; import java.security.ProtectionDomain; import java.util.Collection; import java.util.List; @@ -41,14 +43,20 @@ import org.openide.util.WeakSet; * * @author Jaroslav Tulach <jtul...@netbeans.org> */ -final class NbInstrumentation implements Instrumentation { +final class NbInstrumentation implements InvocationHandler { private static final Logger LOG = Logger.getLogger(NbInstrumentation.class.getName()); private static final Object LOCK = new Object(); private static volatile Collection<NbInstrumentation> ACTIVE; - private final List<ClassFileTransformer> transformers = new CopyOnWriteArrayList<ClassFileTransformer>(); - private static final ThreadLocal<Boolean> IN = new ThreadLocal<Boolean>(); - + private final List<ClassFileTransformer> transformers = new CopyOnWriteArrayList<>(); + private static final ThreadLocal<Boolean> IN = new ThreadLocal<>(); + + private final Instrumentation instrumentationProxy; + + public NbInstrumentation() { + instrumentationProxy = (Instrumentation) Proxy.newProxyInstance(getClass().getClassLoader(), new Class<?>[] { Instrumentation.class }, this); + } + static NbInstrumentation registerAgent(ClassLoader l, String agentClassName) { try { return registerImpl(agentClassName, l); @@ -57,29 +65,31 @@ final class NbInstrumentation implements Instrumentation { return null; } } + static void unregisterAgent(NbInstrumentation instr) { synchronized (LOCK) { if (ACTIVE != null) { - Collection<NbInstrumentation> clone = new WeakSet<NbInstrumentation>(ACTIVE); + Collection<NbInstrumentation> clone = new WeakSet<>(ACTIVE); clone.remove(instr); ACTIVE = clone; } } } + private static NbInstrumentation registerImpl(String agentClassName, ClassLoader l) throws ClassNotFoundException, IllegalArgumentException, NoSuchMethodException, SecurityException, IllegalAccessException, InvocationTargetException { final NbInstrumentation inst = new NbInstrumentation(); synchronized (LOCK) { if (ACTIVE == null) { - ACTIVE = new WeakSet<NbInstrumentation>(); + ACTIVE = new WeakSet<>(); } else { - ACTIVE = new WeakSet<NbInstrumentation>(ACTIVE); + ACTIVE = new WeakSet<>(ACTIVE); } ACTIVE.add(inst); } Class<?> agentClass = Class.forName(agentClassName, true, l); try { Method m = agentClass.getMethod("agentmain", String.class, Instrumentation.class); // NOI18N - m.invoke(null, "", inst); + m.invoke(null, "", inst.getInstrumentationProxy()); } catch (NoSuchMethodException ex) { Method m = agentClass.getMethod("agentmain", String.class); // NOI18N m.invoke(null, ""); @@ -112,86 +122,36 @@ final class NbInstrumentation implements Instrumentation { // @Override - public void addTransformer(ClassFileTransformer transformer, boolean canRetransform) { - transformers.add(transformer); - } - - @Override - public void addTransformer(ClassFileTransformer transformer) { - transformers.add(transformer); - } - - @Override - public boolean removeTransformer(ClassFileTransformer transformer) { - return transformers.remove(transformer); - } - - @Override - public boolean isRetransformClassesSupported() { - return false; - } - - @Override - public void retransformClasses(Class<?>... classes) throws UnmodifiableClassException { - throw new UnmodifiableClassException(); - } - - @Override - public boolean isRedefineClassesSupported() { - return false; - } - - @Override - public void redefineClasses(ClassDefinition... definitions) throws ClassNotFoundException, UnmodifiableClassException { - throw new UnmodifiableClassException(); - } - - @Override - public boolean isModifiableClass(Class<?> theClass) { - return false; - } - - @SuppressWarnings("rawtypes") - @Override - public Class[] getAllLoadedClasses() { - return new Class[0]; - } - - @SuppressWarnings("rawtypes") - @Override - public Class[] getInitiatedClasses(ClassLoader loader) { - return new Class[0]; - } - - @Override - public long getObjectSize(Object objectToSize) { - return 42; - } - - @Override - public void appendToBootstrapClassLoaderSearch(JarFile jarfile) { - } - - @Override - public void appendToSystemClassLoaderSearch(JarFile jarfile) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isNativeMethodPrefixSupported() { - return false; - } - - @Override - public void setNativeMethodPrefix(ClassFileTransformer transformer, String prefix) { - throw new UnsupportedOperationException(); - } - - public void redefineModule(java.lang.Module module, Set<java.lang.Module> extraReads, Map<String, Set<java.lang.Module>> extraExports, Map<String, Set<java.lang.Module>> extraOpens, Set<Class<?>> extraUses, Map<Class<?>, List<Class<?>>> extraProvides) { - throw new UnsupportedOperationException(); + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + switch (method.getName()) { + case "addTransformer": + return transformers.add((ClassFileTransformer) args[0]); + case "removeTransformer": + return transformers.remove(args[0]); + case "isRetransformClassesSupported": + case "isRedefineClassesSupported": + case "isModifiableClass": + case "isNativeMethodPrefixSupported": + case "isModifiableModule": + return false; + case "retransformClasses": + case "redefineClasses": + throw new UnmodifiableClassException(); + case "getAllLoadedClasses": + case "getInitiatedClasses": + return new Class[0]; + case "getObjectSize": + return 42; + case "appendToSystemClassLoaderSearch": + case "setNativeMethodPrefix": + case "redefineModule": + throw new UnsupportedOperationException(); + default: + return null; + } } - public boolean isModifiableModule(java.lang.Module module) { - return false; + public Instrumentation getInstrumentationProxy() { + return instrumentationProxy; } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists