Без какой-либо библиотеки:
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
Они создаются компилятором, когда они требуются "странностям" языка. Простым примером этого является использование внутреннего класса:
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
, Как синтетические поля могут быть созданы в Java?
synthetic
поле создается компилятором Java автоматически в некоторых конкретных случаях.
Примеры:
процесс Справки ключевое слово Java assert
- java.awt. AWTKeyStroke. $assertionsDisabled
процесс Справки ключевое слово java this
- java.util. AbstractList$Itr. 0 this$
Поле в анонимном внутреннем классе - java.util. 1 AbstractList$SubList$ . процесс Справки val$index
на полях Enum - java.nio.file.attribute. AclEntryFlag. $VALUES
Может синтетические поля в Java только быть созданным во времени выполнения? Если нет: Есть ли стандартно-совместимый путь к этому во время компиляции (не изменяясь на некоторые байты в файле класса)
Эти synthetic
, сгенерирован во время компиляции компилятором Java. .class
файл уже содержит эти ACC_SYNTHETIC
флаг. Хотя мы можем всегда генерировать поля Java во времени выполнения.
Да, это выполнимо, и это называется ткачеством во время загрузки.По сути, вам нужно будет определить свой собственный ClassLoader, который будет решать в каждом конкретном случае, нужно ли изменять файл класса, который должен быть загружен; это означает, что вам нужно будет проверить загружаемый двоичный класс, возможно, изменить его, а затем передать его JVM для определения / разрешения. Это немного громоздко, сложно и подвержено ClassCastExceptions (один и тот же класс, определенный в 2 разных загрузчиках классов, даст 2 разных класса, которые не совместимы по назначению).
Обратите внимание, что переплетение позволяет вам делать гораздо больше: вы можете добавлять новые методы, интерфейсы, поля, изменять код существующих классов и многое другое.
Уже есть инструменты, которые могут вам помочь - см., Например, AspectJ как полноценную языковую модификацию или что-то вроде BCEL или javassist, которое позволяет вам писать такие инструменты для переплетения.