gpt4 book ai didi

java - 使用 getDeclaredField() 且字段存在时出现 NoSuchFieldException

转载 作者:行者123 更新时间:2023-11-29 09:29:23 24 4
gpt4 key购买 nike

java.lang.NoSuchFieldException: c
at java.lang.Class.getDeclaredField(Unknown Source)
at ru.onlymc.OnlyMZ.CustomEntityType.getPrivateStatic(CustomEntityType.java:177)

方法:

private static Object getPrivateStatic(Class clazz, String f) throws Exception {
Field field = clazz.getDeclaredField(f);
field.setAccessible(true);
return field.get(null);
}

调用:

private static void a(Class paramClass, String paramString, int paramInt) {
try {
((Map) getPrivateStatic(sg.class, "c")).put(paramString, paramClass);
//...
} catch (Exception exc) {
exc.printStackTrace();
}
}

sg.class(从反编译到确定必填字段确实存在):

private static Map c = new HashMap();
private static Map d = new HashMap();
private static Map e = new HashMap();
private static Map f = new HashMap();
private static Map g = new HashMap();
public static HashMap a = new LinkedHashMap();

最佳答案

抱歉,我无法复制这个。

这是我运行的完整源代码:

import java.lang.reflect.*;
import java.util.*;

@SuppressWarnings("unchecked")
public class ReflectionTest {

private static Object getPrivateStatic(Class clazz, String f) throws Exception {
Field field = clazz.getDeclaredField(f);
field.setAccessible(true);
return field.get(null);
}

private static void a(Class paramClass, String paramString, int paramInt) {
try {
((Map) getPrivateStatic(sg.class, "c")).put(paramString, paramClass);
//...
} catch (Exception exc) {
exc.printStackTrace();
}
}

public static void main(String[] args) throws Exception {
a(String.class, "test", 0);
sg.printC();
}
}

class sg {
private static Map c = new HashMap();
private static Map d = new HashMap();
private static Map e = new HashMap();
private static Map f = new HashMap();
private static Map g = new HashMap();
public static HashMap a = new LinkedHashMap();

public static void printC() {
System.out.println(c);
}
}

这是我运行时得到的输出:

{test=class java.lang.String}

鉴于您没有指定 sg 类的完整反编译源代码,我只能猜测可能发生的几件事:

  • 有多个名为 sg 的类,您的代码正在使用其中一个,但您的反编译输出来自另一个类。
  • 字段存在于 sg 的内部类中。

编辑:您链接到下面的类 sg 似乎包含静态字段 c,并且不包含内部类,所以我会期望能够使用反射来访问该字段。我不能将你的 sg 类与我上面写的 ReflectionTest 类一起使用,因为它依赖于许多其他名称混淆的类,例如 xk

我只能得出这样的结论,即您对尝试从哪个类访问 c 字段有些困惑。我建议将您的 getPrivateStatic 方法更改为以下内容,这可能会提供更有用的错误消息,包括类的名称和其中的所有字段:

    private static Object getPrivateStatic(Class clazz, String f) throws Exception {
try {
Field field = clazz.getDeclaredField(f);
field.setAccessible(true);
return field.get(null);
}
catch (NoSuchFieldException e) {
// Throw a more helpful exception.
throw new NoSuchFieldException(
"Could not find field named '" + f + "' in class '" + clazz +
"'. All fields: " + Arrays.asList(clazz.getDeclaredFields()));
}
}

关于java - 使用 getDeclaredField() 且字段存在时出现 NoSuchFieldException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28517424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com