java - 如何从现场获取类(class)?

标签 java class reflection field

我正在尝试通过反射接收类字段值。但是当我调用我的代码时,我收到异常: IllegalArgumentException: Can not set class field field to java.lang.Class。 (我从 javaagent 调用)

我的代码:

 private static Class<?> GetInstance(Class<?> clz) throws NoSuchFieldException, IllegalAccessException {
    Class<?> clazz1 = null;
    Field f = clz.getDeclaredField("INSTANCE");
    f.setAccessible(true);
    clazz1 = f.get(clz).getClass();
    return clazz1;
}

private static Class GetClassLoader(Class<?> clz) throws NoSuchFieldException, IllegalAccessException, InstantiationException {
    Field f = clz.getDeclaredField("classLoader");
    f.setAccessible(true);
    Class cls = f.get(clz).getClass();
    return cls;
}

public static void agentmain(String agentArgs, Instrumentation inst){
    try{
        inst.addTransformer(new ClientTransfomer());

        Class<?> FMLDeobfuscatingRemapper = null;
        Class<?> InstanceClass;
        Class<?>[] classes = inst.getAllLoadedClasses();
        for(int i = 0;i < classes.length;i++){
            if(classes[i].getName().contains("cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper")){
                FMLDeobfuscatingRemapper = classes[i];
            }

        }

        Class<?> instance = GetInstance(FMLDeobfuscatingRemapper);
        Class cloader = GetClassLoader(instance);

        Method m = cloader.getDeclaredMethod("findClass");
        m.setAccessible(true);
        m.invoke(null, "net.minecraft.client.entity.EntityClientPlayerMP");

    }catch (Exception e){


    }

最佳答案

How to get class from field?

使用fieldValue.getClass()。不需要反射(reflection)。

你的代码没有任何意义。

  • 您有一个名为 GetInstance() 的方法,它返回一个 Class,而不是实例。您需要将此方法的返回值更改为 Object 并删除其中的 getClass() 调用。
  • 您有一个名为 GetClassLoader() 的方法,它返回一个 Class,而不是 ClassLoader。您需要将此方法的返回类型更改为 ClassLoader,并删除其中的 getClass() 调用。

  • 然后,您会反射(reflection)性地将这个对象视为一个ClassLoader,但事实并非如此,并尝试调用findClass() 就可以了。

但是,一旦拥有实例,我认为根本没有必要使用反射:您可以直接调用 getClass().getClassLoader().findClass()

关于java - 如何从现场获取类(class)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35671706/

相关文章:

PHP 获取静态方法

java - Guava 事件总线 : would/should this be GWT-compatible?

java - JDK 1.7 字符串 switch 语句不起作用

c++ - 具有多个参数的C++模板

java - Python:像 Java 中的静态类变量?

c++ - 编译器会为这个对象保留内存吗?

java - 固定大小的长数组的运行时间

java ArrayList 关于结果

java - Spring Web 服务模板将 MustUnderstand 设置为 none 或 false

c++ - 关于摆脱样板代码的想法