Как создать синтетические поля в Java? - PullRequest
9 голосов
/ 21 июля 2010
  1. Как можно создать синтетические поля в Java?

  2. Можно ли создавать синтетические поля в Java только во время выполнения?Если нет: существует ли совместимый со стандартами способ сделать это во время компиляции (без изменения некоторых байтов в файле класса)

Ответы [ 2 ]

15 голосов
/ 21 июля 2010

Они создаются компилятором, когда их требуют "странности" языка. Простой пример этого - использование внутреннего класса:

public class Test
{
    class Inner
    {
    }
}

Класс Test.Inner будет иметь синтетическое поле для представления соответствующего экземпляра класса Test.

Мы можем немного расширить этот код, чтобы показать это поле:

import java.lang.reflect.*;

public class Test
{
    public static void main(String[] args)
    {
        for (Field field : Inner.class.getDeclaredFields())
        {
            System.out.println(field.getName() + ": " + field.isSynthetic());
        }
    }

    class Inner
    {
    }
}

С моим компилятором, который печатает:

this$0: true
4 голосов
/ 21 июля 2010

Да, это выполнимо, и это называется ткачеством во время загрузки. По сути, вам нужно будет определить свой собственный ClassLoader, который будет решать в каждом конкретном случае, нужно ли модифицировать файл класса, который предназначен для загрузки; это означает, что вам нужно будет проверить загружаемый двоичный класс, возможно изменить его, а затем передать его JVM для определения / разрешения. Это немного громоздко, сложно и склонно к ClassCastExceptions (один и тот же класс, определенный в 2 разных загрузчиках классов, даст 2 разных класса, которые не совместимы с присвоением).

Обратите внимание, что ткачество позволяет вам делать гораздо больше: вы можете добавлять новые методы, интерфейсы, поля, изменять код существующих классов и многое другое.

Уже есть инструменты, которые могут вам помочь - смотрите, например, AspectJ как полноценную модификацию языка или что-то вроде BCEL или javassist, который позволяет вам писать такие инструменты для плетения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...