动态创建自定义对象

6

我想知道是否有一种方法可以动态创建对象,或者说不使用Class对象及其属性来创建。我通常的做法是这样的。

ApiHelper apiHelper = new ApiHelper();
User user = new User();
user.Firstname = "FirstName";
apiHelper.send("", user);

我想在我的代码片段上实现这个功能:
ApiHelper apiHelper = new ApiHelper();
apiHelper.send("", new { Firstname = "Firstname"});

send()的第二个参数是一个对象,并且这个对象稍后会被转换为json字符串。

这是一个C#示例,Java中是否有相应的对应方法?我认为如果我使用第一种方法来创建对象,我必须要创建很多类才能符合我需要构建的对象。因此,我希望能够在Java中使用第二种方法。


在Java中,一个简单的用例是从方法中返回多个值。在JavaScript中很容易:你可以返回{你的新对象在这里},但在Java中并不容易。我看到了它的用途。Java中之所以不容易实现这一点的最终原因是你不能在运行时动态更改成员或访问器。 - Alexander Mills
3个回答

5

从技术上讲,这是可以用Java实现的。语法如下:

apiHelper.send("", new Object(){ String firstName = "Firstname"});

然而,这通常是没有什么用的。更有可能的情况是创建一个接口/类来定义您想要的方法和字段,并传递该实例。

示例:

class Data{
    String firstname;
    public Data(String firstname){
        this.firstname=firstname;
    }
}

你能否解释一下为什么使用那种语法是无用的吗?好的,你回答了我的问题,这正是我一直在寻找的,所以我会接受你的答案。 - Luke Villanueva
@ljpv14,这通常是无用的,因为没有实际的方法来稍后访问该值。虽然使用反射可能是可行的,但通常您希望从对象中提取数据的方式更直接。 - resueman
好的,我没有明确说明我将使用该对象将数据发送到Web服务。不是真正创建和保存/处理之后。所以我认为这种方法是正确的。 - Luke Villanueva

2

其实你只需要一个以Firstname作为参数的构造函数。

public User(String fName) {
    Firstname = fName;
}

尽管在Java中像在C#中一样将成员大写不是惯例;应该是

String firstname;

然后你只需要这样做...

apiHelper.send("", new User("Firstname"));


我意识到我真的必须这样做,但我说过我会把这个作为最后的选择。跟进问题是,正如你所说,在Java中将我的成员大写不是惯例。在我的情况下,我正在将此对象转换为JSON字符串并将其发送到用C#编写的Web服务上。在那一端,属性/成员是用大写字母编写的,这会创建冲突吗? - Luke Villanueva
没试过,但我真的看不出为什么会这样。 - ChiefTwoPencils
@ljpv14,为什么这会是你的最后选择?你是说你必须这样做吗?在你澄清之后,假设这意味着你在创建并传递User之后不需要访问它,那么其他答案为什么不起作用呢? - ChiefTwoPencils

1
如果您无法修改User以添加构造函数,则我将使用“双重花括号初始化”,在其中您可以在实例化该类的类中运行代码。
ApiHelper apiHelper = new ApiHelper();
apiHelper.send("", new User(){{
        Firstname = "Firstname";
    }});

在实例化之后,立即执行了Firstname = "Firstname";这一行代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接