gpt4 book ai didi

java - 创建通用 JavaBean 构建器

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:05 25 4
gpt4 key购买 nike

我正在尝试为值类创建一个通用构建器。您知道那些充满 getter 和 setter 的愚蠢类。

目标是能够像这样使用它:

        MyValueObject myvalueObject = new GenericBuilder<MyValueObject>(MyValueObject.class)
.with("someIntegerProperty", 12)
.build();

到目前为止,这是我使用反射的尝试:

public class GenericBuilder<T> {
private T bean;
private Class<T> clazz;

public GenericBuilder(Class<T> clazz) {
this.clazz = clazz;

Constructor<?> constructor = null;
try {
constructor = Class.forName(clazz.getCanonicalName()).getConstructor();
bean = (T) constructor.newInstance();
} catch (NoSuchMethodException | ClassNotFoundException | IllegalAccessException | InvocationTargetException | InstantiationException e) {
e.printStackTrace();
}
}

public <S> GenericBuilder<T> with(String propertyName, S value) {
Method method;
try {
method = Class.forName(clazz.getCanonicalName())
.getMethod("set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1), Object.class);
method.invoke(bean, (S) value);
} catch (NoSuchMethodException | ClassNotFoundException | InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
}
return this;
}

public T build() {
return bean;
}
}

但是方法调用失败并返回 NoSuchMethodException,因为在运行时确定的参数类型是 Object 而不是正确的类型。 这是由于类型删除

我知道我可以使用 method.getParameterTypes()[0] 获取实际参数类型,但我不能像这样用它来转换 value

method.invoke(bean, (method.getParameterTypes()[0]) value); //compiler error

我该如何解决这个问题?

最佳答案

我已经求助于遍历方法名称并检查是否实际上只有一个参数。这当然不是很安全,但它适用于我的测试。

这是新的 with(String propertyName, S value) 方法实现:

public <S> GenericBuilder<T> with(String propertyName, S value) {
try {
String target = "set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
for (Method m : clazz.getMethods()) {
if (target.equals(m.getName())) {
Class<?>[] params = m.getParameterTypes();
if (params.length == 1) {
m.invoke(bean, value);
break;
}
}
}
} catch (InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
}
return this;
}

关于java - 创建通用 JavaBean 构建器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50287191/

25 4 0
文章推荐: java - JDBC Prepared Statement 对 session 范围感到困惑
文章推荐: java - 解压缩时 FileOutputStream 抛出 FileNotFoundException
文章推荐: javascript - iOS Javascript