【问题标题】:Trying to enlist the arguments of a method with the values尝试使用值获取方法的参数
【发布时间】:2017-07-19 04:19:50
【问题描述】:

我想保存传递给方法的参数的值和类型。

这是我正在做的一个更大项目的要求。所以,目前我需要保存参数的值和类型,按照它们在方法签名中声明的顺序,就在方法体的第一行。但是,我不知道参数的数量。 因此,我正在寻找一种 JAVA 技术,该技术将其所有方法参数及其对应值纳入其中。

参数的数量可能非常多,而且参数的名称是未知的。

如果这不能直接发生,任何关于如何做到这一点的建议都会有所帮助。

public void stay(String temp1, int temp2, double temp3){

    //**--code to save the values of temp1, temp2, temp3 somehow--**

    //method body that will change the value of parameters
}

编辑 1: 上面提到的stay 方法可以是任何东西,我不能显式更改它的代码。我正在使用检测在方法主体中添加几行代码。这样,我想在方法体中添加某些代码段(逻辑上在开头),以保存参数的值。可以以 JSON 格式保存。使用 javassist 可以知道它们的类型。但瓶颈是知道参数的值。

换一种说法: 如果要将方法的参数值存储在列表中(在方法内部声明),您会怎么做?由于参数的数量可能很大,我们不能真正对过程进行硬编码。 谢谢。

【问题讨论】:

  • 您所说的“保存”或“登记”到底是什么意思?不能只将它们存储在类级变量中吗?
  • 我想在方法体中更改参数值之前保存它们。我想将参数的值存储在一个列表中,这样,如果我想在将来某个时候重新调用该方法,我知道按指定顺序的参数类型及其保存的值,我可以调用该方法而无需在调用方法的地方到达程序。即使要将它们存储在类级别变量中,我也必须知道参数的数量以及它们的名称。我说清楚了吗?
  • 你怎么会不知道参数的数量是多少,因为方法的参数数量和类型是在编译时设置的?那么作为参数传递的对象呢?您需要将它们保存为原始状态吗?
  • 所以基本上所考虑的方法将来自完全不同的来源。如果需要,我的程序应该对其进行调试。我错误地提到计数将不知道。我可以使用反射知道计数。我的坏那里。但是,我想保存这些参数的值。如果它们不是原始类型,它们将被序列化。传递给方法的某些参数(原始和非原始),需要作为方法体的第一步保存(或序列化为 JSON 对象)。

标签: java methods reflection parameters instrumentation


【解决方案1】:

我不确定你的问题,但我想我有一个答案。

您是否要调用具有未知类型参数的函数?

如下实现你的类:

public class SomeClass {
    public void someFuntion(Object... objects)
    {
        for (int i = 0; i < objects.length; i++) {
            Object object = objects[i];
            if(object != null)
                System.out.println("Argument " + i + ": " + object.toString() + " (" + object.getClass().getSimpleName() + ")");
            else
                System.out.println("Argument " + i + ": null");
        }
    }
}

然后,调用这个类:

SomeClass someClass = new SomeClass();
someClass.someFuntion("test", 8, new SomeClass());

输出将是:

参数 0:测试(字符串)

参数 1:8(整数)

论据 2:app.SomeClass@55f96302 (SomeClass)

希望对你有帮助!

编辑:如果要将结果序列化为 JSON 结构,例如可以将其存储为 JSON 数组。

EDIT2:或者将您的逗留方式替换为:

public void stay(Object... objects)

现在你的 stay 方法的参数可以在 stay 方法中的 objects 数组中使用。

【讨论】:

  • 这是我想到达的地方。我想到了类似的步骤。但是,我想要的是:someClass.someFuntion("test", 8, new SomeClass()); 这应该与我指定的方法someClass.someFuntion(temp1, temp2,temp3) 的参数一起传递,其中 temp1、temp2、temp3 是stay 方法的参数。
  • 感谢您的耐心等待。但是,有这个限制(在 cmets 中也提到过),我无法更改 stay 的代码。我已尝试使问题更清楚,请通过一次,希望对您有所帮助。
  • 您是否在您的(可编辑)代码中调用了stay 方法?如果是,只需在方法调用之前存储参数。否则,请查看Java reflection documentation
猜你喜欢
  • 1970-01-01
  • 2012-01-02
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多