有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在实现一个IdChecker程序,用于检查项目的类和方法的“id”的唯一性。IdChecker仅在编译我的项目时运行。。。在我推动释放之前

对于类,很容易获得id,因为我只需要映射所有类,然后调用MyClass。getField(“CLASS_ID”)。getShort(MyClass.getField(“CLASS_ID”);然后我创建一个包含类名和classIdentifier的类包装器

对于方法来说,它有点复杂,因为我不能使用反射来访问方法的局部变量。。。但是在我的项目中,我使用调试记录器记录每个“进入方法”和“离开方法”。为了获取我想要调用一个方法的局部变量,然后在我的日志缓冲区中读取这个日志项中的最后一个条目(谁是“离开方法”日志项),我获取了方法\u 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;
            }

        .
        .
        .

共 (1) 个答案

  1. # 1 楼答案

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

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

    这仍然有一些问题。首先,invoke的第一个参数不是您输入的类,而是该类的对象的实例(对于静态方法,为null)。在调用该类的实例方法之前,需要搜索该类的构造函数并构造该类的实例。 第二个问题是,这不适用于需要基元的函数,基元不能为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