gpt4 book ai didi

java - 如果提供了字段名称,如何一般填充对象?

转载 作者:行者123 更新时间:2023-12-02 04:01:29 24 4
gpt4 key购买 nike

我需要在方法内创建并填充一个对象。唯一的信息是成员字段名称(作为字符串传递)和该字段的相关值(作为对象传递)。考虑到性能,最合适的设计模式是什么? - 如果反射(reflection)会带来惩罚,那么反射(reflection)将不是首选方法。

更新:
要设置的值来自一个对象,该对象充当值的生成器,具有一组为特定字段返回正确值的方法。例如。对于成员 Double x; 它将是 generator.getX()

最佳答案

将所有 getter 复制到所有可用 setter 的简单函数如下。通过更多的工作,您可以缓存此信息并加快速度,但它可能已经足够快了。

public static <T> T copyTo(Object from, T to) {
for(Method m : to.getClass().getMethods()) {
if (!m.getName().startsWith("set") || m.getParameterCount() != 1)
continue;
try {
Method getter = from.getClass().getMethod("g" + m.getName().substring(1));
m.invoke(to, getter.invoke(from));
} catch (NoSuchMethodException ignored) {
// ignored
} catch (InvocationTargetException | IllegalAccessException e) {
throw new AssertionError(e);
}
}
return to;
}

注意:只有存在匹配的 getter 和 setter 的字段才会尝试从一个字段复制到另一个字段。

public static void main(String[] args) {
One orig = new One(1, "hi", 3);
One to = new One();
One copy = copyTo(orig, to);
System.out.println(to);
}

static class One {
int x;
String y;
double z;

public One() {
}

public One(int x, String y, double z) {
this.x = x;
this.y = y;
this.z = z;
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

public String getY() {
return y;
}

public void setY(String y) {
this.y = y;
}

public double getZ() {
return z;
}

public void setZ(double z) {
this.z = z;
}

@Override
public String toString() {
return "One{" +
"x=" + x +
", y='" + y + '\'' +
", z=" + z +
'}';
}
}

打印

One{x=1, y='hi', z=3.0}
<小时/>

如果你想一般地创建一个对象,你需要使用反射。

唯一的选择是字节码生成,这实现起来会更加复杂,并且只能节省几分之一微秒的时间。

为了节省一微秒,需要花多少天时间来实现这一点?

关于java - 如果提供了字段名称,如何一般填充对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34843327/

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