Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java/Kotlin中通过静态元编程创建函数_Java_Kotlin_Metaprogramming_Abstract Syntax Tree - Fatal编程技术网

在Java/Kotlin中通过静态元编程创建函数

在Java/Kotlin中通过静态元编程创建函数,java,kotlin,metaprogramming,abstract-syntax-tree,Java,Kotlin,Metaprogramming,Abstract Syntax Tree,我有一个大约有40个成员变量的类。现在我想为它们创建getter和setter(它们需要触发一种PropertyChangeEvent,getter也不是默认的;但是每个变量的代码实际上是相同的) 我想问的不是仅仅创建80个函数和(某种程度上)复制粘贴所有内容,而是是否可以通过(静态)元编程(或者我不知道的其他方式)来实现这一点 我以前在ruby上做过很多工作,我大概只写了如下的sthg: instance_variables.each do |var| define_method "g

我有一个大约有40个成员变量的类。现在我想为它们创建getter和setter(它们需要触发一种PropertyChangeEvent,getter也不是默认的;但是每个变量的代码实际上是相同的)

我想问的不是仅仅创建80个函数和(某种程度上)复制粘贴所有内容,而是是否可以通过(静态)元编程(或者我不知道的其他方式)来实现这一点

我以前在ruby上做过很多工作,我大概只写了如下的sthg:

instance_variables.each do |var|
    define_method "get_#{var}" do
        return var if var.cached?
        return var = super
    end
    # ...
end

我知道java和Kotlin是完全不同的,因为它们是编译和静态类型的,但是因为它在C(预处理器)、C++甚至VHDL(用于生成)中都是有用的,类似的东西是可能的,所以我不能相信这是不可能的。 我已经读到注释是java的起点,但我也读到,人们(通常)不能用注释更改现有的类

我已经读过,在那里你可以注释字段来为它们生成普通的getter和setter,hashCode和equals函数以及其他很多东西,但是开发人员指出,这是一个有很多私人编译器API的黑客行为,它们可以随时中断。
这并不是我首先想要的(因为我的IDE足够智能,可以直接创建它们,而不需要这些技巧)

样板代码令人讨厌,而且会弄脏代码,但是复制粘贴真实代码是我讨厌的事情,因此问题就来了


我必须承认,我不知道Kotlin的情况如何,但我听说扩展应该是切入点。如果这更简单(或者至少是可能的话),我也愿意这样做。

除了您提到的预编译器之外,我不知道在Java中有什么干净或简单的方法可以做到这一点。在Kotlin中,您可以使用属性委托执行所描述的操作。看看Scala。它有宏(但它们没有你想要的那么强大)