gpt4 book ai didi

java - 具有自定义注释的抽象类

转载 作者:行者123 更新时间:2023-11-30 11:04:30 25 4
gpt4 key购买 nike

首先,我对 Java 反射、泛型和注解还很陌生。

我想开发一个抽象类,它允许我通过提供基于子类自定义注释的通用实现/方法来支持各种 POJO(value objects 更准确)。

抽象类

public abstract class AbstractValueObject<T>

private Class<T> targetClass;
private Integer id;
private String rowState;

public AbstractValueObject(final Class<T> targetClassToSet) {

this.targetClass = targetClassToSet;

for (Method method : targetClass.getMethods()) {

if (method.isAnnotationPresent(ValueObjectId.class)) {
... invoke getter that has the @ValueObjectId annotation from the child class, and set that value in the id class attribute...
}

if (method.isAnnotationPresent(ValueObjectRowState.class)) {
... invoke getter that has the @ValueObjectRowState annotation from the child classfro, and set that value in the rowState class attribute...
}
}
}

public boolean isNew() {
... logic based on id and rowState ...
}

public boolean isUpdated() {
... logic based on id and rowState ...
}

public boolean isDeleted() {
... logic based on id and rowState ...
}

abstract boolean isValid();
}

示例子类

public class MyCustomClass extends AbstractValueObject<MyCustomClass> implements Serializable {

private String fileId;
private String fileRowState;

@ValueObjectId
public String getFileId() {
return fileId;
}

public void setFileId(String fileId) {
this.fileId = fileId;
}

@ValueObjectRowState
public String getFileRowState() {
return fileRowState
}

public void setFileRowState(String fileRowState) {
this.fileRowState= fileRowState;
}

@Override
public boolean isValid() {
...specific implementation...
}
}

注释

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ValueObjectId {
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ValueObjectRowState {
}

可行吗?我还没有找到类似这个要求的例子。

谢谢

最佳答案

然而,几乎所有的东西都应该以这种方式工作:

您想在包装的对象上调用 getter。但是您只将对象的类作为参数传递。如果您的方法可行,则必须将对象作为参数提供。

请注意,反射的性能不是很好,尤其是应用于多个对象时。每次将新对象传递给 AbstractValueObject 的构造函数时,您的方法都必须对其进行计算,缓存反射信息(Method、MethodHandle)会使其更快。

如果您知道满足值对象的所有对象类(并且您不打算在运行时引入新类),那么访问者模式会更合适且性能更高。

关于java - 具有自定义注释的抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29992899/

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