All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.test4j.function.SerializedLambda Maven / Gradle / Ivy

There is a newer version: 2.7.0
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.test4j.function;


import org.springframework.util.SerializationUtils;
import org.test4j.tools.commons.ClazzHelper;

import java.io.*;

/**
 * 这个类是从 {@link java.lang.invoke.SerializedLambda} 里面 copy 过来的
 * 字段信息完全一样
 * 

* 负责将一个支持序列的 Function 序列化为 SerializedLambda * * @author HCL * @since 2018/05/10 */ @SuppressWarnings("unused") public class SerializedLambda implements Serializable { private static final long serialVersionUID = 8025925345765570181L; private Class capturingClass; private String functionalInterfaceClass; private String functionalInterfaceMethodName; private String functionalInterfaceMethodSignature; private String implClass; private String implMethodName; private String implMethodSignature; private int implMethodKind; private String instantiatedMethodType; private Object[] capturedArgs; /** * 通过反序列化转换 lambda 表达式,该方法只能序列化 lambda 表达式,不能序列化接口实现或者正常非 lambda 写法的对象 * * @param lambda lambda对象 * @return 返回解析后的 SerializedLambda */ public static SerializedLambda resolve(SExecutor lambda) { if (!lambda.getClass().isSynthetic()) { throw new RuntimeException("该方法仅能传入 lambda 表达式产生的合成类"); } try (ObjectInputStream objIn = new ObjectInputStream(new ByteArrayInputStream(SerializationUtils.serialize(lambda))) { @Override protected Class resolveClass(ObjectStreamClass objectStreamClass) throws IOException, ClassNotFoundException { Class clazz = super.resolveClass(objectStreamClass); return clazz == java.lang.invoke.SerializedLambda.class ? SerializedLambda.class : clazz; } }) { return (SerializedLambda) objIn.readObject(); } catch (ClassNotFoundException | IOException e) { throw new RuntimeException("This is impossible to happen", e); } } /** * 获取接口 class * * @return 返回 class 名称 */ public String getFunctionalInterfaceClassName() { return normalName(functionalInterfaceClass); } /** * 获取实现的 class * * @return 实现类 */ public Class getImplClass() { return ClazzHelper.getClazz(getImplClassName()); } /** * 获取 class 的名称 * * @return 类名 */ public String getImplClassName() { return normalName(implClass); } /** * 获取实现者的方法名称 * * @return 方法名称 */ public String getImplMethodName() { return implMethodName; } /** * 正常化类名称,将类名称中的 / 替换为 . * * @param name 名称 * @return 正常的类名 */ private String normalName(String name) { return name.replace('/', '.'); } /** * @return 字符串形式 */ @Override public String toString() { return String.format("%s -> %s::%s", getFunctionalInterfaceClassName(), getImplClass().getSimpleName(), implMethodName); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy