Package xyz.cofe.trambda
Class LambdaDump
- java.lang.Object
-
- xyz.cofe.trambda.LambdaDump
-
- All Implemented Interfaces:
Serializable
public class LambdaDump extends Object implements Serializable
Дамп лямбды, со всеми зависимыми лямбдами. Для создания дампа смотритеdump(Fn1)- See Also:
- Serialized Form
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classLambdaDump.RestoreВосстановление класса
-
Field Summary
Fields Modifier and Type Field Description protected booleancacheSerializedLambdaprotected List<Object>capturedArgsЗахваченные переменные которые передаются в лямбду (замыкание)Map<Class<?>,Map<String,CBegin>>classByteCodeCacheкеш байт кодаprotected LambdaNodelambdaNode"Корневая" лямбда которая вызываетсяMap<SerializedLambda,LambdaNode>lambdaNodeCacheкеш сериализованная лямбда / корневой узел байт кодаprotected Map<MHandle,LambdaNode>refsMap<Serializable,SerializedLambda>serializableLambdaCacheкеш лямбда / сериализованная форма
-
Constructor Summary
Constructors Constructor Description LambdaDump()Конструктор по умолчанию
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected CBeginclassByteCode(Class<?> baseClass, String clazz)получение байт кода классаLambdaDumpconfigure(Consumer<LambdaDump> conf)Конфигурация экземпляраstatic voiddump(Consumer<String> log, ByteCode byteCode)Получение текстового описания, для отладкиLambdaDumpdump(xyz.cofe.fn.Fn1<?,?> fn)Создание дампа лямбды, вызыветdumpSLambda(Serializable)protected LambdaDumpdumpSLambda(Serializable serializableLambda)Создание дампа лямбды sl: Ищет в кешеserializableLambdaCacheинтерфейс сериализованной лямбдыSerializedLambdaДля найденного sl создает дерево - вызовlambdaNode(Class, String, String, String)Упаковывает в дамп, прикладывая захваченные параметрыSerializedLambda.getCapturedArg(int)List<Object>getCapturedArgs()Возвращает захваченные переменные которые передаются в лямбду (замыкание)LambdaNodegetLambdaNode()Возвращает корень дерева лямбдvoidinvalidateCache()Очистка кэшаbooleanisCacheSerializedLambda()protected LambdaNodelambdaNode(Class<?> baseClass, String implClass, String methName, String methSign)Создание узла для байт кода лямбды и связанных лямбд
protected voidonLambdaNode(LambdaNode ln)Вызывается при создании узла лямддыprotected voidonSerializedLambda(SerializedLambda sl)Вызывается при нахождении сериализованного представления лямбдыLambdaDump.Restorerestore()Восстановление классаprotected SerializedLambdaserializedLambda(Serializable lambda)получение сералиазованной лямбдыvoidsetCacheSerializedLambda(boolean v)voidsetCapturedArgs(List<Object> ls)Указывает захваченные переменные которые передаются в лямбду (замыкание)voidsetLambdaNode(LambdaNode node)Указывает корень дерева лямбд
-
-
-
Field Detail
-
capturedArgs
protected List<Object> capturedArgs
Захваченные переменные которые передаются в лямбду (замыкание)
-
lambdaNode
protected LambdaNode lambdaNode
"Корневая" лямбда которая вызывается
-
serializableLambdaCache
public final transient Map<Serializable,SerializedLambda> serializableLambdaCache
кеш лямбда / сериализованная форма
-
lambdaNodeCache
public final transient Map<SerializedLambda,LambdaNode> lambdaNodeCache
кеш сериализованная лямбда / корневой узел байт кода
-
cacheSerializedLambda
protected boolean cacheSerializedLambda
-
classByteCodeCache
public final transient Map<Class<?>,Map<String,CBegin>> classByteCodeCache
кеш байт кода
-
refs
protected final transient Map<MHandle,LambdaNode> refs
-
-
Method Detail
-
configure
public LambdaDump configure(Consumer<LambdaDump> conf)
Конфигурация экземпляра- Parameters:
conf- конфигурация- Returns:
- SELF ссылка
-
getCapturedArgs
public List<Object> getCapturedArgs()
Возвращает захваченные переменные которые передаются в лямбду (замыкание)- Returns:
- захваченные переменные
-
setCapturedArgs
public void setCapturedArgs(List<Object> ls)
Указывает захваченные переменные которые передаются в лямбду (замыкание)- Parameters:
ls- захваченные переменные
-
getLambdaNode
public LambdaNode getLambdaNode()
Возвращает корень дерева лямбд- Returns:
- корень дерева лямбд
-
setLambdaNode
public void setLambdaNode(LambdaNode node)
Указывает корень дерева лямбд- Parameters:
node- корень дерева лямбд
-
dump
public LambdaDump dump(xyz.cofe.fn.Fn1<?,?> fn)
Создание дампа лямбды, вызыветdumpSLambda(Serializable)- Parameters:
fn- лямбда- Returns:
- дамп
-
invalidateCache
public void invalidateCache()
Очистка кэша
-
onSerializedLambda
protected void onSerializedLambda(SerializedLambda sl)
Вызывается при нахождении сериализованного представления лямбды- Parameters:
sl- сриализованная лямбда
-
onLambdaNode
protected void onLambdaNode(LambdaNode ln)
Вызывается при создании узла лямдды- Parameters:
ln- узел лямбды
-
isCacheSerializedLambda
public boolean isCacheSerializedLambda()
-
setCacheSerializedLambda
public void setCacheSerializedLambda(boolean v)
-
dumpSLambda
protected LambdaDump dumpSLambda(Serializable serializableLambda)
Создание дампа лямбды- sl: Ищет в кеше
serializableLambdaCacheинтерфейс сериализованной лямбдыSerializedLambda - Для найденного sl создает дерево - вызов
lambdaNode(Class, String, String, String) - Упаковывает в дамп, прикладывая захваченные параметры
SerializedLambda.getCapturedArg(int)
- Parameters:
serializableLambda- лямбда- Returns:
- дамп
- sl: Ищет в кеше
-
serializedLambda
protected SerializedLambda serializedLambda(Serializable lambda)
получение сералиазованной лямбды- Parameters:
lambda- лямбда- Returns:
- сериализованная лямбда
-
classByteCode
protected CBegin classByteCode(Class<?> baseClass, String clazz) throws IOException
получение байт кода класса- Parameters:
baseClass- класс для доступа к ресурсам (*.class)clazz- целевой класс, чей байт код интересует- Returns:
- байт код
- Throws:
IOException- ошибка чтение байт кода
-
lambdaNode
protected LambdaNode lambdaNode(Class<?> baseClass, String implClass, String methName, String methSign)
Создание узла для байт кода лямбды и связанных лямбд
JAVA Специфичное поведение
Связанные лямбды находит
в инструкцииMInvokeDynamicInsn
где среди аргументовMInvokeDynamicInsn.getBootstrapMethodArguments()есть аргумент типаHandleArg
который ссылается на статичный вызов (MHandle.getTag()=Opcodes.H_INVOKESTATIC) лямбды (методаMHandle.getName()с префиксом "lambda$")
Ранее найденные лямбды кеширует вrefs, кеш актуален в пределах вызоваdumpSLambda(Serializable)- Parameters:
baseClass- класс для доступа к ресурсам (*.class)implClass- класс содержащий код лямбдыmethName- имя метода класса содержащий код лямбдыmethSign- сигнатура метода класса содержащий код лямбды- Returns:
- узел для лямбды и связанных лямбд
-
restore
public LambdaDump.Restore restore()
Восстановление класса- Returns:
- восстановление
-
-