Как создать синтетические поля в Java?

Без какой-либо библиотеки:

def camelify(out):
    return (''.join(["_"+x.lower() if i<len(out)-1 and x.isupper() and out[i+1].islower()
         else x.lower()+"_" if i<len(out)-1 and x.islower() and out[i+1].isupper()
         else x.lower() for i,x in enumerate(list(out))])).lstrip('_').replace('__','_')

Немного тяжело, но

CamelCamelCamelCase ->  camel_camel_camel_case
HTTPRequest         ->  http_request
GetHTTPRequest      ->  get_http_request
getHTTPRequest      ->  get_http_request
9
задан MRalwasser 21 July 2010 в 10:09
поделиться

3 ответа

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

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
15
ответ дан 4 December 2019 в 10:30
поделиться

, Как синтетические поля могут быть созданы в Java?

synthetic поле создается компилятором Java автоматически в некоторых конкретных случаях.

Примеры:

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

Эти synthetic, сгенерирован во время компиляции компилятором Java. .class файл уже содержит эти ACC_SYNTHETIC флаг. Хотя мы можем всегда генерировать поля Java во времени выполнения.

[еще 1120] Информация

  • Этот статья описывает эти ACC_SYNTHETIC флаг в деталях
  • Этот ссылка списки весь synthetic поля в JDK

1
ответ дан 4 December 2019 в 10:30
поделиться

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

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

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

4
ответ дан 4 December 2019 в 10:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: