Class LambdaDump

  • All Implemented Interfaces:
    Serializable

    public class LambdaDump
    extends Object
    implements Serializable
    Дамп лямбды, со всеми зависимыми лямбдами. Для создания дампа смотрите dump(Fn1)
    See Also:
    Serialized Form
    • 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
        кеш байт кода
    • Constructor Detail

      • LambdaDump

        public LambdaDump()
        Конструктор по умолчанию
    • 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)
      • 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:
        восстановление
      • dump

        public static void dump​(Consumer<String> log,
                                ByteCode byteCode)
        Получение текстового описания, для отладки
        Parameters:
        log - текстовое описание
        byteCode - байт-код