gpt4 book ai didi

java - 当我知道该类时如何正确调用方法?

转载 作者:行者123 更新时间:2023-12-01 13:42:14 26 4
gpt4 key购买 nike

我正在实现一个 IdChecker 程序,它检查项目的类和方法的“id”的唯一性。 IdChecker 仅在我的项目编译时运行...在我推送版本之前。

对于类,很容易获取 id,因为我只需要映射所有类,然后调用 MyClass.getField("CLASS_ID").getShort(MyClass.getField("CLASS_ID"));然后我创建一个包含类名和类标识符的 ClassWrapper。

对于方法,它有点复杂,因为我无法使用反射来访问方法本地的变量...但是...在我的项目中,我使用调试记录器来记录每个“进入方法”和“离开方法”。为了获取局部变量,我想调用一个方法,然后在我的 logBu​​ffer 中读取该日志条目的最后一个条目(谁是“离开方法”日志条目),我得到了 METHOD_ID。

我的问题:

我无法调用它生成 IllegalArgumentException 的类上的方法...我不需要将参数传递给该方法,我只是想调用它们来生成日志条目。

private void getMethodsList() throws IllegalArgumentException,
IllegalAccessException, NoSuchFieldException, SecurityException {
final short METHOD_ID = 0x03;
/* Log-entering the method */
mLogger.logDebug((byte) 1, METHOD_ID);

/* Create the MethodWrapper list corresponding
to each element of the ClassWrapper list */
for(Class<?> clazz : mClasses)
{
/* Get the declared methods from each class */
for(Method method : clazz.getDeclaredMethods())
{
/* Get the name of the method */
String newName = method.getName();
short newIdentifier = 0;
try
{
method.invoke(clazz, new Object[]{null});
/* Get the identifier of the class */
newIdentifier = AbstractDebugLogger.mLastMethodID;
}

.
.
.

最佳答案

method.invoke(...) 需要一个实际可用于调用该方法的参数数组。在本例中,您为其指定 {null},它适用于任何接受单个对象的函数,但不适用于其他函数。要调用任意函数,您需要将参数列表的长度与函数所需的参数数量相匹配:

method.invoke(..., new Object[method.getParameterTypes().length])

这仍然存在一些问题。首先,invoke 的第一个参数不是您输入的类,而是该类的对象实例(或者 null,对于静态方法)。您需要搜索该类的构造函数并构造该类的实例,然后才能调用该类的实例方法。第二个问题是,这不适用于需要原语的函数,原语不能为空。您可以检查参数的类别,并根据需要将 null 替换为 0 或 false。第三个也是最重要的问题是您实际上并不想调用该方法。您想要检索有关该方法的信息,这也是执行此操作如此困难的原因。这种情况恰好存储在方法内部。正确的解决方案是仅存储附加到方法的信息,并带有注释:

@Retention(RetentionPolicy.RUNTIME)
@interface ID {
int value();
}
...
@ID(1337)
void exampleMethod() { ... }
...
newIdentifier = method.getAnnotation(ID.class).value(); //returns 1337 for exampleMethod

关于java - 当我知道该类时如何正确调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20638663/

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