Javassist在Minecraft JVM中找不到现有的类(NotFoundException)

时间:2018-04-14 00:00:05

标签: java bytecode javassist

我正在尝试使用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无法找到这个类呢?如果有人能指出我正确的方向,我将不胜感激。

0 个答案:

没有答案