From f6abbc99aba5e37dfd470068898140ad2771b2d3 Mon Sep 17 00:00:00 2001 From: redkale Date: Thu, 29 Jun 2023 14:32:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96LambdaFunction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/redkale/util/Utility.java | 43 ++++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/redkale/util/Utility.java b/src/main/java/org/redkale/util/Utility.java index 1c387afaf..535e45938 100644 --- a/src/main/java/org/redkale/util/Utility.java +++ b/src/main/java/org/redkale/util/Utility.java @@ -300,21 +300,12 @@ public final class Utility { private static String readLambdaFieldNameFromBytes(Serializable func) { try { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(out); - oos.writeObject(func); - ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(out.toByteArray())) { - @Override - protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { - if (desc.getName().contains("SerializedLambda") || desc.getName().contains("$Lambda$")) { - return org.redkale.util.SerializedLambda.class; - } else { - return super.resolveClass(desc); - } - } - }; - return Utility.readFieldName(((org.redkale.util.SerializedLambda) in.readObject()).getImplMethodName()); - } catch (Throwable e) { + ObjectWriteStream out = new ObjectWriteStream(); + out.enableReplaceObject(true); + out.writeObject(func); + out.close(); + return readFieldName(out.methodNameReference.get()); + } catch (IOException e) { throw new RedkaleException(e); } } @@ -337,6 +328,28 @@ public final class Utility { } } + static class ObjectWriteStream extends ObjectOutputStream { + + public final ObjectReference methodNameReference = new ObjectReference<>(); + + public ObjectWriteStream() throws IOException { + super(new ByteArrayOutputStream()); + } + + @Override + protected Object replaceObject​(Object obj) throws IOException { + if (obj instanceof java.lang.invoke.SerializedLambda) { + methodNameReference.set(((java.lang.invoke.SerializedLambda) obj).getImplMethodName()); + } + return super.replaceObject(obj); + } + + @Override + public boolean enableReplaceObject(boolean enable) throws SecurityException { + return super.enableReplaceObject(enable); + } + } + /** * @param value from which next positive power of two will be found. *