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);
}
* @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);
}
/**
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);
}
package javassist;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.TypeVariable;
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;
}
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("<init>");
+ MethodParametersAttribute attr
+ = (MethodParametersAttribute)minfo.getAttribute(MethodParametersAttribute.tag);
+ assertEquals(1, attr.size());
+ assertNull(attr.parameterName(0));
+ }
}