|
|
|
@ -19,20 +19,19 @@ import com.fr.third.net.bytebuddy.build.HashCodeAndEqualsPlugin;
|
|
|
|
|
import com.fr.third.net.bytebuddy.description.method.MethodDescription; |
|
|
|
|
import com.fr.third.net.bytebuddy.description.type.TypeDescription; |
|
|
|
|
import com.fr.third.net.bytebuddy.dynamic.loading.ClassInjector; |
|
|
|
|
import com.fr.third.net.bytebuddy.dynamic.loading.ClassLoadingStrategy; |
|
|
|
|
import com.fr.third.net.bytebuddy.implementation.Implementation; |
|
|
|
|
import com.fr.third.net.bytebuddy.implementation.LoadedTypeInitializer; |
|
|
|
|
import com.fr.third.net.bytebuddy.implementation.bytecode.ByteCodeAppender; |
|
|
|
|
import com.fr.third.net.bytebuddy.implementation.bytecode.Removal; |
|
|
|
|
import com.fr.third.net.bytebuddy.implementation.bytecode.StackManipulation; |
|
|
|
|
import com.fr.third.net.bytebuddy.implementation.bytecode.member.MethodInvocation; |
|
|
|
|
import com.fr.third.research.annotations.SuppressFBWarnings; |
|
|
|
|
import com.fr.third.net.bytebuddy.implementation.bytecode.collection.ArrayFactory; |
|
|
|
|
import com.fr.third.net.bytebuddy.implementation.bytecode.constant.ClassConstant; |
|
|
|
|
import com.fr.third.net.bytebuddy.implementation.bytecode.constant.IntegerConstant; |
|
|
|
|
import com.fr.third.net.bytebuddy.implementation.bytecode.constant.NullConstant; |
|
|
|
|
import com.fr.third.net.bytebuddy.implementation.bytecode.constant.TextConstant; |
|
|
|
|
import com.fr.third.net.bytebuddy.implementation.bytecode.member.MethodInvocation; |
|
|
|
|
import com.fr.third.org.objectweb.asm.MethodVisitor; |
|
|
|
|
import com.fr.third.research.annotations.SuppressFBWarnings; |
|
|
|
|
|
|
|
|
|
import java.lang.ref.Reference; |
|
|
|
|
import java.lang.ref.ReferenceQueue; |
|
|
|
@ -223,7 +222,11 @@ public class NexusAccessor {
|
|
|
|
|
return new Unavailable("Nexus injection was explicitly disabled"); |
|
|
|
|
} else { |
|
|
|
|
try { |
|
|
|
|
Class<?> nexusType = new ClassInjector.UsingReflection(ClassLoader.getSystemClassLoader(), ClassLoadingStrategy.NO_PROTECTION_DOMAIN) |
|
|
|
|
/* |
|
|
|
|
* 实例化UsingReflection时要指定非null的ProtectionDomain,否则开启-security后经由这里调用具体方法时会校验权限失败 |
|
|
|
|
* 这里指定为NexusAccessor的ProtectionDomain,即fine-third jar |
|
|
|
|
*/ |
|
|
|
|
Class<?> nexusType = new ClassInjector.UsingReflection(ClassLoader.getSystemClassLoader(), getClass().getProtectionDomain()) |
|
|
|
|
.inject(Collections.singletonMap(TypeDescription.ForLoadedType.of(Nexus.class), ClassFileLocator.ForClassLoader.read(Nexus.class))) |
|
|
|
|
.get(TypeDescription.ForLoadedType.of(Nexus.class)); |
|
|
|
|
return new Dispatcher.Available(nexusType.getMethod("register", String.class, ClassLoader.class, ReferenceQueue.class, int.class, Object.class), |
|
|
|
|