【问题标题】:Java helper class to dynamically create member variables and getter methods用于动态创建成员变量和 getter 方法的 Java 助手类
【发布时间】:2019-10-21 10:38:59
【问题描述】:

我正在尝试创建一个辅助方法,它将接受成员变量(可以是任意数量的成员变量)的名称(类型 String)并自动初始化/创建成员变量以及 getter 方法.所以我会这样称呼:

helperClass("hello", "myName", "is", "bob")

helperClass 看起来像这样:

public class helperClass { 
    helperClass(String ...a) {
        for (String s: a) 
            //create member variables and getter methods dynamically
}

所以,最后,函数的调用者会是这样的:

public class helperClass { 
    private String hello
    private String myName
    private String is
    private String bob

    //getter methods below
    ...
}

来自 Python,所以不确定这种类型的东西在 Java 中是否可行。

【问题讨论】:

  • 你说的是生成源代码,还是在运行时修改JVM中的类定义?
  • Java 是静态类型的,您将如何使用这种动态创建的类型?你期望"Hello""My name""is" "Bob"有什么getter和成员变量?
  • @azurefrog 生成成员变量,为了清楚起见,我稍微编辑了我的问题
  • @ElliottFrisch 我明白了,这就是为什么在我的问题中我说它将是String 类型,所以我们假设它们都是String 类型
  • Java 是静态类型的,没有 python 风格的元编程。您可以使用字节码库来生成您的类,并且您可以使用反射来与之交互 - 但是,这不是“容易”。

标签: java getter-setter helper


【解决方案1】:

是的。您可以动态创建 getter 和 setter 方法。 Tutorial for Java Dynamic POJO creation 。但是此方法将涉及您创建一个包含方法声明的预定义字符串。

例如: String s= "public void doSonething(String ... args){ // 函数体 }" . 然后,您可以在运行时将此字符串转换为函数。根据您的需要,您可以定义一个自定义字符串,其中包含您需要的方法声明。请参阅我附加的上述教程链接中的一些示例。

【讨论】:

    【解决方案2】:

    我认为答案是使用 IDE。它们都有“添加属性”函数,可以生成声明和适当命名的 getter 和 setter。

    如果您更喜欢手动输入属性,它们都具有生成 getter/setter 函数,这些函数将查看您输入的属性(找出缺少哪些 getter 和 setter)并提供在其中创建适当命名的 getter 和 setter为您选择的那些进行批量处理。

    要回答您的具体问题,是的,您可以编写自己的类,该类采用字符串列表(即属性名称)并将它们打印为一系列 getter 和 setter,这是基本的字符串连接:

    
      private String generateGetter(String propName) {
         return String.format("   public String get%s()\n    return this.%s;\n  }", StringUtils.capitalize(propName), propName);
      }
    

    要将propName的第一个字母转换为大写(getter和setter方法的约定,可以自己做,也可以使用apache's string utils

    【讨论】:

    • 目的是为使用不同变量调用它的调用者创建一个辅助方法
    • 我想我不明白你的问题。以上是生成getter的辅助方法。你可以复制它来生成一个吸气剂。您可以随意调用两者。您可以将它们包装在生成“类声明”位的更大方法中。较大的方法可以接受 List 参数并为每个参数生成属性以及 getter 和 setter。最后,您可以做任何您喜欢的事情,例如打印、写入文件或动态编译。但我认为你的问题是关于生成该代码????
    • 是的,完全正确。我的主要目标是能够优化这个帮助方法,这样即使调用者使用不同的参数调用它,它也能够为它们生成代码,而不是为每个输入参数定制两个不同的类。
    猜你喜欢
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 2016-08-31
    • 1970-01-01
    • 2014-05-27
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多