4

我有一个想法,但无法弄清楚如何实现这一点。

public class BaseDomain<T>{

//Generic methods goes here

}

public class Domain1 extends BaseDomain<Domain1>{

private int id;

private String name;

//only properties should be present here

}

public class Domain2 extends BaseDomain<Domain2>{

private int id;

private String name;

//only properties should be present here

}

在上述场景中,我可以轻松地在基类中定义所有泛型方法,并且可以通过使用泛型在我的所有域类中使用。但是我的问题是我想设计一个机制,开发人员必须通过该机制仅定义域类中的属性(没有 getter/setter),但是 BaseDomain 应该以某种方式动态地为每个域提供 getter/setter。

任何建议都非常感谢!

4

5 回答 5

2

您无法使用 Java 的正常功能来做到这一点。

您可以使用Lombok 之类的工具。

我个人不喜欢这种方法,因为它在你的项目中引入了“魔法”,在某些时候会造成麻烦,而且只会节省一点样板代码。

于 2013-05-10T12:55:00.710 回答
2

使用反射,您可以做到这一点。

public class BaseDomain<T>{


    public String getName() {
        return this.getClass().getField("name").get(this);
    }

    public void setName(String value) {
        this.getClass().getField("name").set(this, value);
    }

}

请注意,this.getClass()将引用该对象的运行时类Domain1,例如。因此,您可以访问那里的字段、获取/设置值等。

如果将属性声明为private或,则可能需要设置访问权限protected。他们是public,它应该工作。

正如 OP 所提到的,使用getDeclaredFields()不会强制您声明公共字段,不幸的是,您必须遍历(或使用 a Map)才能使用Field特定名称访问。

如果您的对象实例中不存在该字段,您将收到异常。

于 2013-05-10T13:04:28.087 回答
0

在我看来,这听起来像是您应该使用接口。使用接口定义必须提供的功能,实现它的类必须提供它们。在您的代码中,您永远不会只引用特定的类,就像一个类一样。

例子:

public interface MyInterface
{
     public String getName();
}

public MyClass implements MyInterface
{
    public String getName { return " test"; }
}

public OtherClass
{
    private MyInterface = new MyClass();
}

如果您不希望程序员实现您的接口,这只能通过反射来完成。您可以使用代理对象来实现 getter 和 setter 并通过此对象访问它们,就像这里讨论的那样:Java 类可以添加运行时自身的方法?

于 2013-05-10T12:55:10.010 回答
0

如果您的代码没有某种预处理器,您将无法做到这一点。预处理器会在编译 Java 文件之前对其进行解析,添加所需的方法,然后才将生成的预处理文件推送到编译器。无论如何,看到 Java 是一种静态类型的语言 - 这是一个非常糟糕的主意。

如果您希望它是动态的,您可以使用Groovy而不是 Java。Groovy 是一种独立的语言,它与 Java 有很多共同之处,并编译为 JVM 字节码。但是,它允许您非常轻松地制作这些“动态”方法。

于 2013-05-10T12:56:23.077 回答
0

假设访问级别修饰符允许使用,则基类中定义的任何变量、getter 和 setter 都可以在扩展基类的类中使用。

这是一个例子:

public class BaseClass {

    private int id;

    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

class AnotherClass extends BaseClass {

    public String getIdString() {
        return Integer.toString(getId());
    }
}

由于 id 在基类中被定义为私有,扩展类获取 id 的唯一方法是使用公共 getId 方法。通过使用 getId 和 setId 方法。扩展类可以使用 Id 字段而无需定义它。

如果您希望扩展类能够访问字段本身,则必须保护这些字段,而不是私有的。

扩展类只需要定义他们自己需要的 getter 和 setter。他们可以使用已经在基类中定义的 getter 和 setter,再次假设访问级别修饰符允许使用。

于 2013-05-10T14:02:32.213 回答