Например, в виде следующего кода:
object Test extends App
{
trait Class
{
val f1: Int
}
val c = new Class {
val f1: Int = 1
val f2: String = "Class"
}
println(c.f1)
println(c.f2)
}
Я просматриваю байт-код с помощью декомпилятора и замечаю, что компиляция генерирует java-интерфейс «Test.Class» как псевдокод:
trait Class
{
val f1: Int
}
и класс «Test$$anon$1», реализующий «Test.Class», псевдокод как:
class Test$$anon$1 extends Class
{
val f1: Int = 1
val f2: String = "Class"
}
а затем компилятор инициализирует переменную 'c' как:
c = new Test$$anon$1()
затем вызывает член 'f1' как обычный вызов:
println(c.f1)
но он вызывает «f2», используя отражение:
println(reflMethod(c, f2))
Здесь, поскольку определение анонимного класса «Test$$anon$1» видно в той же области, можно ли использовать макрос для изменения сгенерированного кода, чтобы вызвать «f2» как обычное поле, избегая отражения?
Я просто хочу изменить код вызова в той же области, а не изменять код отражения в разных областях, например. экземпляр структурного типа в качестве аргумента в вызове функции. Так что я думаю, что это возможно в теории. Но я не знаком с макросом scala, предложения и примеры кода приветствуются. Спасибо!
f2
либо вClass
, либо в явном подтипе) - person cchantep   schedule 08.06.2020