From 784a7c1ef9996d166aedcd4aacd1fa12016dde7f Mon Sep 17 00:00:00 2001 From: wuwen Date: Sun, 8 Oct 2023 16:31:26 +0800 Subject: [PATCH] fixes GitHub Issue 462 (Internal class issues in the Java 21) --- .../bytecode/MethodParametersAttribute.java | 9 +++-- src/test/javassist/JvstTest5.java | 32 ++++++++++++++++++ ...nerClassWithoutParameters$InnerClass.class | Bin 0 -> 495 bytes .../Java21InnerClassWithoutParameters.class | Bin 0 -> 358 bytes 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/Java21InnerClassWithoutParameters$InnerClass.class create mode 100644 src/test/resources/Java21InnerClassWithoutParameters.class diff --git a/src/main/javassist/bytecode/MethodParametersAttribute.java b/src/main/javassist/bytecode/MethodParametersAttribute.java index b9c252a9..f78f6c72 100644 --- a/src/main/javassist/bytecode/MethodParametersAttribute.java +++ b/src/main/javassist/bytecode/MethodParametersAttribute.java @@ -32,7 +32,8 @@ public class MethodParametersAttribute extends AttributeInfo { byte[] data = new byte[names.length * 4 + 1]; data[0] = (byte)names.length; for (int i = 0; i < names.length; i++) { - ByteArray.write16bit(cp.addUtf8Info(names[i]), data, i * 4 + 1); + String name = names[i]; + ByteArray.write16bit(name == null ? 0 : cp.addUtf8Info(name), data, i * 4 + 1); ByteArray.write16bit(flags[i], data, i * 4 + 3); } @@ -61,7 +62,8 @@ public class MethodParametersAttribute extends AttributeInfo { * @param i the position of the parameter. */ public String parameterName(int i) { - return getConstPool().getUtf8Info(name(i)); + int index = name(i); + return index == 0 ? null : getConstPool().getUtf8Info(index); } /** @@ -87,7 +89,8 @@ public class MethodParametersAttribute extends AttributeInfo { String[] names = new String[s]; int[] flags = new int[s]; for (int i = 0; i < s; i++) { - names[i] = cp.getUtf8Info(name(i)); + int index = name(i); + names[i] = index == 0 ? null : cp.getUtf8Info(index); flags[i] = accessFlags(i); } diff --git a/src/test/javassist/JvstTest5.java b/src/test/javassist/JvstTest5.java index 4a370632..f1c56837 100644 --- a/src/test/javassist/JvstTest5.java +++ b/src/test/javassist/JvstTest5.java @@ -1,5 +1,8 @@ package javassist; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.TypeVariable; @@ -9,6 +12,8 @@ import javassist.bytecode.AttributeInfo; import javassist.bytecode.ClassFile; import javassist.bytecode.ConstPool; import javassist.bytecode.InnerClassesAttribute; +import javassist.bytecode.MethodInfo; +import javassist.bytecode.MethodParametersAttribute; import javassist.bytecode.NestHostAttribute; import javassist.bytecode.NestMembersAttribute; import javassist.expr.ExprEditor; @@ -593,4 +598,31 @@ public class JvstTest5 extends JvstTestRoot { } catch (CannotCompileException e) {} } + + public void testGithubIssue462Java21WithoutParameters() throws IOException { + + //This is a class file compiled by Java-21 + //javac Java21InnerClassWithoutParameters.java + //public class Java21InnerClassWithoutParameters { + // class InnerClass implements Runnable { + // public void run() { + // } + // } + //} + String classFileName = "./Java21InnerClassWithoutParameters$InnerClass.class"; + ClassLoader classLoader = getClass().getClassLoader(); + File classFile = new File(classLoader.getResource(classFileName).getFile()); + + CtClass cc = sloader.makeClass(new FileInputStream(classFile)); + cc.getClassFile().compact(); + + ClassFile cf = cc.getClassFile2(); + ConstPool cp = cf.getConstPool(); + + MethodInfo minfo = cf.getMethod(""); + MethodParametersAttribute attr + = (MethodParametersAttribute)minfo.getAttribute(MethodParametersAttribute.tag); + assertEquals(1, attr.size()); + assertNull(attr.parameterName(0)); + } } diff --git a/src/test/resources/Java21InnerClassWithoutParameters$InnerClass.class b/src/test/resources/Java21InnerClassWithoutParameters$InnerClass.class new file mode 100644 index 0000000000000000000000000000000000000000..c1c6cab5287f14cf89edc70d4a69990df9ee01af GIT binary patch literal 495 zcmah_O-sW-5Pg%+8l#P^A9xTHL|PGxUKK$KqEf4<)bqAoG$q|YcH`N<GE5u%xR6}?2L=icpjCMSmAoyICQX9T;` z9rRUBCg#$}Oz&1T9|56NjlIv665~V?_Bw;wK_}f2 z!Re<{<~IkilEZvHmf7Rqgy=@H@U+t9C9_-+f`>HECh{UKb!t@(i}eVNq15Iw)yBsv zVW+l@5LW+`nq{jew&C+>2@8B@i_OI%$B?rvMoVP>1N6=SVTrxRv7j!qcR78F7-*Jo e(Y47|5dL*Iun}>=!U|etY-5dMz;qvNtOLJr9dgV7 literal 0 HcmV?d00001 diff --git a/src/test/resources/Java21InnerClassWithoutParameters.class b/src/test/resources/Java21InnerClassWithoutParameters.class new file mode 100644 index 0000000000000000000000000000000000000000..a6208c524fd931d0d8839e2f9243612246e320dc GIT binary patch literal 358 zcmaiw&q~8U5XQf0(ynf!t=>HpL{!A0=ORdnRj)RDly!JC-mEyVuL$Y1d}G4k&N`mgtDOC_$qUKor?U17p4kXT z8#kRtL4^LCt8mY8Po*#*oNb&uZ1oYc7Fg8j7BPa78^lNQ;&==o9h8^*#WOgx>NH>wf9`FyVAXNVV literal 0 HcmV?d00001 -- 2.39.5