2023-06-06 18:22:11 +02:00
|
|
|
--- a/src/main/javassist/ClassPool.java 2023-06-06 17:43:01.915579458 +0200
|
|
|
|
+++ b/src/main/javassist/ClassPool.java 2023-06-06 18:01:26.034999321 +0200
|
|
|
|
@@ -1141,59 +1141,6 @@
|
|
|
|
* Once this method is called, further modifications are not allowed
|
|
|
|
* any more.
|
|
|
|
*
|
|
|
|
- * <p>This method is available in Java 9 or later.
|
|
|
|
- * It loads the class
|
|
|
|
- * by using {@code java.lang.invoke.MethodHandles} with {@code neighbor}.
|
|
|
|
- * </p>
|
|
|
|
- *
|
|
|
|
- * @param ct the class converted into {@code java.lang.Class}.
|
|
|
|
- * @param neighbor a class belonging to the same package that
|
|
|
|
- * the converted class belongs to.
|
|
|
|
- * @since 3.24
|
|
|
|
- */
|
|
|
|
- public Class<?> toClass(CtClass ct, Class<?> neighbor)
|
|
|
|
- throws CannotCompileException
|
|
|
|
- {
|
|
|
|
- try {
|
|
|
|
- return javassist.util.proxy.DefineClassHelper.toClass(neighbor,
|
|
|
|
- ct.toBytecode());
|
|
|
|
- }
|
|
|
|
- catch (IOException e) {
|
|
|
|
- throw new CannotCompileException(e);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Converts the class to a <code>java.lang.Class</code> object.
|
|
|
|
- * Once this method is called, further modifications are not allowed
|
|
|
|
- * any more.
|
|
|
|
- *
|
|
|
|
- * <p>This method is available in Java 9 or later.
|
|
|
|
- * It loads the class
|
|
|
|
- * by using the given {@code java.lang.invoke.MethodHandles.Lookup}.
|
|
|
|
- * </p>
|
|
|
|
- *
|
|
|
|
- * @param ct the class converted into {@code java.lang.Class}.
|
|
|
|
- * @since 3.24
|
|
|
|
- */
|
|
|
|
- public Class<?> toClass(CtClass ct,
|
|
|
|
- java.lang.invoke.MethodHandles.Lookup lookup)
|
|
|
|
- throws CannotCompileException
|
|
|
|
- {
|
|
|
|
- try {
|
|
|
|
- return javassist.util.proxy.DefineClassHelper.toClass(lookup,
|
|
|
|
- ct.toBytecode());
|
|
|
|
- }
|
|
|
|
- catch (IOException e) {
|
|
|
|
- throw new CannotCompileException(e);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Converts the class to a <code>java.lang.Class</code> object.
|
|
|
|
- * Once this method is called, further modifications are not allowed
|
|
|
|
- * any more.
|
|
|
|
- *
|
|
|
|
* <p>When the JVM is Java 11 or later, this method loads the class
|
|
|
|
* by using {@code java.lang.invoke.MethodHandles} with {@code neighbor}.
|
|
|
|
* The other arguments {@code loader} and {@code domain} are not used;
|
|
|
|
--- a/src/main/javassist/CtClass.java 2023-06-06 17:43:01.915579458 +0200
|
|
|
|
+++ b/src/main/javassist/CtClass.java 2023-06-06 18:02:41.811506992 +0200
|
|
|
|
@@ -1300,59 +1300,6 @@
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Converts this class to a <code>java.lang.Class</code> object.
|
|
|
|
- * Once this method is called, further modifications are not
|
|
|
|
- * allowed any more.
|
|
|
|
- *
|
|
|
|
- * <p>This method is provided for convenience. You should use
|
|
|
|
- * {@code toClass(Lookup)} for better compatibility with the
|
|
|
|
- * module system.
|
|
|
|
- *
|
|
|
|
- * <p>Note: this method calls <code>toClass()</code>
|
|
|
|
- * in <code>ClassPool</code>.
|
|
|
|
- *
|
|
|
|
- * <p><b>Warning:</b> A Class object returned by this method may not
|
|
|
|
- * work with a security manager or a signed jar file because a
|
|
|
|
- * protection domain is not specified.
|
|
|
|
- *
|
|
|
|
- * @param neighbor A class belonging to the same package that this
|
|
|
|
- * class belongs to. It is used to load the class.
|
|
|
|
- * @see ClassPool#toClass(CtClass,Class)
|
|
|
|
- * @see #toClass(java.lang.invoke.MethodHandles.Lookup)
|
|
|
|
- * @since 3.24
|
|
|
|
- */
|
|
|
|
- public Class<?> toClass(Class<?> neighbor) throws CannotCompileException
|
|
|
|
- {
|
|
|
|
- return getClassPool().toClass(this, neighbor);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Converts this class to a <code>java.lang.Class</code> object.
|
|
|
|
- * Once this method is called, further modifications are not
|
|
|
|
- * allowed any more.
|
|
|
|
- *
|
|
|
|
- * <p>This method is provided for convenience. If you need more
|
|
|
|
- * complex functionality, you should write your own class loader.
|
|
|
|
- *
|
|
|
|
- * <p>Note: this method calls <code>toClass()</code>
|
|
|
|
- * in <code>ClassPool</code>.
|
|
|
|
- *
|
|
|
|
- * <p><b>Warning:</b> A Class object returned by this method may not
|
|
|
|
- * work with a security manager or a signed jar file because a
|
|
|
|
- * protection domain is not specified.
|
|
|
|
- *
|
|
|
|
- * @param lookup used when loading the class. It has to have
|
|
|
|
- * an access right to define a new class.
|
|
|
|
- * @see ClassPool#toClass(CtClass,java.lang.invoke.MethodHandles.Lookup)
|
|
|
|
- * @since 3.24
|
|
|
|
- */
|
|
|
|
- public Class<?> toClass(java.lang.invoke.MethodHandles.Lookup lookup)
|
|
|
|
- throws CannotCompileException
|
|
|
|
- {
|
|
|
|
- return getClassPool().toClass(this, lookup);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Converts this class to a <code>java.lang.Class</code> object.
|
|
|
|
* Once this method is called, further modifications are not allowed
|
|
|
|
* any more.
|
|
|
|
*
|
|
|
|
--- a/src/main/javassist/Loader.java 2023-06-06 17:43:01.923579511 +0200
|
|
|
|
+++ b/src/main/javassist/Loader.java 2023-06-06 17:43:21.591712028 +0200
|
|
|
|
@@ -421,9 +421,6 @@
|
2019-04-15 10:57:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private boolean isDefinedPackage(String name) {
|
|
|
|
- if (ClassFile.MAJOR_VERSION >= ClassFile.JAVA_9)
|
|
|
|
- return getDefinedPackage(name) == null;
|
|
|
|
- else
|
|
|
|
return getPackage(name) == null;
|
|
|
|
}
|
|
|
|
|
2023-06-06 18:22:11 +02:00
|
|
|
--- a/src/main/javassist/util/proxy/DefineClassHelper.java 2023-06-06 17:43:01.979579888 +0200
|
|
|
|
+++ b/src/main/javassist/util/proxy/DefineClassHelper.java 2023-06-06 17:56:53.241171849 +0200
|
|
|
|
@@ -44,15 +44,11 @@
|
|
|
|
ClassLoader loader, ProtectionDomain protectionDomain)
|
|
|
|
throws ClassFormatError, CannotCompileException
|
|
|
|
{
|
|
|
|
- if (neighbor != null)
|
|
|
|
- return toClass(neighbor, bcode);
|
|
|
|
- else {
|
|
|
|
// Lookup#defineClass() is not available. So fallback to invoking defineClass on
|
|
|
|
// ClassLoader, which causes a warning message.
|
|
|
|
return super.defineClass(name, bcode, off, len, neighbor, loader, protectionDomain);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
- }
|
|
|
|
|
|
|
|
private static class Java9 extends Helper {
|
|
|
|
final class ReferencedUnsafe {
|
|
|
|
@@ -275,65 +271,5 @@
|
2019-04-15 10:57:44 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-06-06 18:22:11 +02:00
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Loads a class file by {@code java.lang.invoke.MethodHandles.Lookup}.
|
|
|
|
- * It is obtained by using {@code neighbor}.
|
|
|
|
- *
|
|
|
|
- * @param neighbor a class belonging to the same package that the loaded
|
|
|
|
- * class belogns to.
|
|
|
|
- * @param bcode the bytecode.
|
|
|
|
- * @since 3.24
|
|
|
|
- */
|
|
|
|
- public static Class<?> toClass(Class<?> neighbor, byte[] bcode)
|
|
|
|
- throws CannotCompileException
|
|
|
|
- {
|
|
|
|
- try {
|
|
|
|
- DefineClassHelper.class.getModule().addReads(neighbor.getModule());
|
|
|
|
- Lookup lookup = MethodHandles.lookup();
|
|
|
|
- Lookup prvlookup = MethodHandles.privateLookupIn(neighbor, lookup);
|
|
|
|
- return prvlookup.defineClass(bcode);
|
|
|
|
- } catch (IllegalAccessException | IllegalArgumentException e) {
|
|
|
|
- throw new CannotCompileException(e.getMessage() + ": " + neighbor.getName()
|
|
|
|
- + " has no permission to define the class");
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Loads a class file by {@code java.lang.invoke.MethodHandles.Lookup}.
|
|
|
|
- * It can be obtained by {@code MethodHandles.lookup()} called from
|
|
|
|
- * somewhere in the package that the loaded class belongs to.
|
|
|
|
- *
|
|
|
|
- * @param bcode the bytecode.
|
|
|
|
- * @since 3.24
|
|
|
|
- */
|
|
|
|
- public static Class<?> toClass(Lookup lookup, byte[] bcode)
|
|
|
|
- throws CannotCompileException
|
|
|
|
- {
|
|
|
|
- try {
|
|
|
|
- return lookup.defineClass(bcode);
|
|
|
|
- } catch (IllegalAccessException | IllegalArgumentException e) {
|
|
|
|
- throw new CannotCompileException(e.getMessage());
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
2019-04-15 10:57:44 +02:00
|
|
|
- /**
|
|
|
|
- * Loads a class file by {@code java.lang.invoke.MethodHandles.Lookup}.
|
|
|
|
- *
|
|
|
|
- * @since 3.22
|
|
|
|
- */
|
|
|
|
- static Class<?> toPublicClass(String className, byte[] bcode)
|
|
|
|
- throws CannotCompileException
|
|
|
|
- {
|
|
|
|
- try {
|
|
|
|
- Lookup lookup = MethodHandles.lookup();
|
|
|
|
- lookup = lookup.dropLookupMode(java.lang.invoke.MethodHandles.Lookup.PRIVATE);
|
|
|
|
- return lookup.defineClass(bcode);
|
|
|
|
- }
|
|
|
|
- catch (Throwable t) {
|
|
|
|
- throw new CannotCompileException(t);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
private DefineClassHelper() {}
|
|
|
|
}
|
2023-06-06 18:22:11 +02:00
|
|
|
--- a/src/main/javassist/util/proxy/FactoryHelper.java 2023-06-06 17:43:01.979579888 +0200
|
|
|
|
+++ b/src/main/javassist/util/proxy/FactoryHelper.java 2023-06-06 18:03:56.172005165 +0200
|
|
|
|
@@ -148,29 +148,7 @@
|
2019-04-15 10:57:44 +02:00
|
|
|
{
|
|
|
|
try {
|
|
|
|
byte[] b = toBytecode(cf);
|
|
|
|
- if (ProxyFactory.onlyPublicMethods)
|
|
|
|
- return DefineClassHelper.toPublicClass(cf.getName(), b);
|
2021-12-15 08:41:51 +01:00
|
|
|
- else
|
|
|
|
- return DefineClassHelper.toClass(cf.getName(), neighbor,
|
|
|
|
- loader, domain, b);
|
2023-06-06 18:22:11 +02:00
|
|
|
- }
|
|
|
|
- catch (IOException e) {
|
|
|
|
- throw new CannotCompileException(e);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Loads a class file by a given lookup.
|
|
|
|
- *
|
|
|
|
- * @param lookup used to define the class.
|
|
|
|
- * @since 3.24
|
|
|
|
- */
|
|
|
|
- public static Class<?> toClass(ClassFile cf, java.lang.invoke.MethodHandles.Lookup lookup)
|
|
|
|
- throws CannotCompileException
|
|
|
|
- {
|
|
|
|
- try {
|
|
|
|
- byte[] b = toBytecode(cf);
|
|
|
|
- return DefineClassHelper.toClass(lookup, b);
|
2021-12-15 08:41:51 +01:00
|
|
|
+ return DefineClassHelper.toClass(cf.getName(), neighbor, loader, domain, b);
|
2019-04-15 10:57:44 +02:00
|
|
|
}
|
|
|
|
catch (IOException e) {
|
2021-12-15 08:41:51 +01:00
|
|
|
throw new CannotCompileException(e);
|
2023-06-06 18:22:11 +02:00
|
|
|
--- a/src/main/javassist/util/proxy/ProxyFactory.java 2023-06-06 17:43:01.979579888 +0200
|
|
|
|
+++ b/src/main/javassist/util/proxy/ProxyFactory.java 2023-06-06 18:05:06.452476007 +0200
|
|
|
|
@@ -636,10 +636,7 @@
|
|
|
|
if (writeDirectory != null)
|
|
|
|
FactoryHelper.writeFile(cf, writeDirectory);
|
|
|
|
|
|
|
|
- if (lookup == null)
|
|
|
|
thisClass = FactoryHelper.toClass(cf, getClassInTheSamePackage(), cl, getDomain());
|
|
|
|
- else
|
|
|
|
- thisClass = FactoryHelper.toClass(cf, lookup);
|
|
|
|
|
|
|
|
setField(FILTER_SIGNATURE_FIELD, signature);
|
|
|
|
// legacy behaviour : we only set the default interceptor static field if we are not using the cache
|