我正在尝试通过反射接收类字段值。但是当我调用我的代码时,我收到异常: 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/