【问题标题】:Make a class that implements an interface without altering the class code创建一个实现接口而不更改类代码的类
【发布时间】:2014-12-25 03:01:38
【问题描述】:

我想创建一个实现接口 Titi 的 Toto 类。常见的方式是:

public class Toto implements Titi

问题是我正在自动生成 Toto 类,并且每次实现 Titi 时都添加它是不切实际的。有没有办法让它在 Java EE 6 中实现接口。(例如 AOP) 请给我一个例子

【问题讨论】:

  • 对于 AOP,你可以使用 Spring。
  • 在您的代码中对其进行子类化并添加您需要的内容。
  • 也就是说,不要直接使用生成的类;使用您需要的附加功能对其进行子类化。我过去经常使用 Hibernate 类来做这件事,尽管组合是另一种方法,可以说是更好的方法。
  • 我不明白究竟什么是不切实际的。让您的代码生成器添加“实现 Titi”?
  • @LouisWasserman :生成的代码在目标中,没有在 git 中提交。单独要求我的团队添加工具 Titi 是不切实际的。

标签: java interface aop


【解决方案1】:

您有几个解决方案。在不了解代码生成的性质的情况下,很难提供超出一般性的帮助。不过,AOP 似乎有点矫枉过正。

  1. 更改生成源的模板,或使用其源生成功能
  2. 在生成后更改源。
  3. 在您的源代码中使用子类或组合。

1.如果可以,请更改模板。大多数生成器都知道,它们生成的源代码可能不完全符合您的需求,并且允许插入代码或修改签名。即使它不是超级简单,大多数都有模板,您可以从类路径中提取并重新打包,甚至。

2. 简单的搜索和替换可能会改变代码签名,您可以在生成的类的末尾填充您自己的实现。这应该集成到您的构建过程中。

3. 我的首选是将生成的类组合到您自己的类中,或者如果这样做有意义的话,将其子类化。这是超级、超级简单的,并且只需要微不足道的、可自动化的更改。我可能还会更改生成的类的名称。

换句话说,你有一个类Toto,其中包含一些生成的方法,比如someMethod

public class Toto {
    public void someMethod() { ... }
}

创建一个新的、命名良好的类,分别将其子类化或组合在其中:

public class TotoSubclass extends Toto implements Titi {
    // Titi implementation
}

public class TotoComposite implements Titi {
    private Toto toto;
    public TotoComposite(Toto toto) { this.toto = toto; }
    // Titi implementation
    // Toto delegates, IDEs can generate.
}

对于某些类型的问题,我不会抱怨以这种方式扩展 Toto,例如,对于 DAO,只添加附加功能可能是有意义的。在某些(大多数?)情况下,继承可能会很痛苦,而合成可能更安全。 IDE 可以生成委托方法,或者您可以使用字节码操作(例如 Lombok)来自动生成委托,但使用 IDE 更通用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    相关资源
    最近更新 更多