我正在尝试使用Java代理修改Minecraft JVM中的类 net.minecraft.block.BlockCactus 。我的attacher / injector使用byte-buddy-agent-1.8.1.jar和tools.jar连接到JVM。代理仅使用Javassist。
我遇到的问题是,当我尝试从ClassPool加载此类时,它总是返回NotFoundException。这是我的代理变换器的代码:
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.LoaderClassPath;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
public class Transformer implements ClassFileTransformer {
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
System.out.println("Transformer initialized");
if ("net/minecraft/block/BlockCactus".equals(className)) {
System.out.println("BlockCactus found: " + className);
try {
ClassPool cp = ClassPool.getDefault();
cp.insertClassPath(new LoaderClassPath(loader));
CtClass cc = cp.get("net.minecraft.block.BlockCactus");
System.out.println(cc);
CtMethod m = cc.getDeclaredMethod("func_149670_a");
System.out.println(m);
byte[] byteCode = cc.toBytecode();
cc.detach();
return byteCode;
} catch (Exception ex) {
ex.printStackTrace();
}
}
return null;
}
}
ClassFileTransformer能够找到net.minecraft.block.BlockCactus,因为记录了“BlockCactus found:net / minecraft / block / BlockCactus”。 ClassPool是实际问题。
以下是错误输出:
[10:36:28] [Attach Listener/INFO]: [agent.Transformer:transform:15]: Transformer initialized
[10:36:28] [Attach Listener/INFO]: [agent.Transformer:transform:17]: BlockCactus found: net/minecraft/block/BlockCactus
[10:36:28] [Attach Listener/INFO]: [java.lang.Throwable$WrappedPrintStream:println:748]: javassist.NotFoundException: net.minecraft.block.BlockCactus
[10:36:28] [Attach Listener/INFO]: [java.lang.Throwable$WrappedPrintStream:println:748]: at javassist.ClassPool.get(ClassPool.java:422)
[10:36:28] [Attach Listener/INFO]: [java.lang.Throwable$WrappedPrintStream:println:748]: at agent.Transformer.transform(Transformer.java:21)
[10:36:28] [Attach Listener/INFO]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
[10:36:28] [Attach Listener/INFO]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
[10:36:28] [Attach Listener/INFO]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
[10:36:28] [Attach Listener/INFO]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:144)
[10:36:28] [Attach Listener/INFO]: [java.lang.Throwable$WrappedPrintStream:println:748]: at agent.Agent.agentmain(Agent.java:23)
[10:36:28] [Attach Listener/INFO]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[10:36:28] [Attach Listener/INFO]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[10:36:28] [Attach Listener/INFO]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[10:36:28] [Attach Listener/INFO]: [java.lang.Throwable$WrappedPrintStream:println:748]: at java.lang.reflect.Method.invoke(Method.java:483)
[10:36:28] [Attach Listener/INFO]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
[10:36:28] [Attach Listener/INFO]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:411)
我也很肯定这个类确实存在,因为我确实使用了用户in this thread的第三个解决方案eis来列出所有类。 net.minecraft.block.BlockCactus 最终被列入名单。
那么为什么Javassist无法找到这个类呢?如果有人能指出我正确的方向,我将不胜感激。