From a0f4d935a20ffeefcfe4c66730ec702b7fff0928 Mon Sep 17 00:00:00 2001
From: chibash -version 3.19
-
EnclosingMethod_attribute
.
*/
@@ -98,12 +100,18 @@ public class EnclosingMethodAttribute extends AttributeInfo {
/**
* Returns the method name specified by method_index
.
+ * If the method is a class initializer (static constructor),
+ * {@link MethodInfo#nameClinit} is returned.
*/
public String methodName() {
ConstPool cp = getConstPool();
int mi = methodIndex();
- int ni = cp.getNameAndTypeName(mi);
- return cp.getUtf8Info(ni);
+ if (mi == 0)
+ return MethodInfo.nameClinit;
+ else {
+ int ni = cp.getNameAndTypeName(mi);
+ return cp.getUtf8Info(ni);
+ }
}
/**
diff --git a/src/test/Test.java b/src/test/Test.java
index 83fe2954..a6d31c68 100644
--- a/src/test/Test.java
+++ b/src/test/Test.java
@@ -8,7 +8,9 @@ public class Test {
}
ClassPool cp = ClassPool.getDefault();
- CtClass str = cp.get("java.lang.String");
+ CtClass inner3 = cp.get("test2.Anon$Anon2.1");
+ CtBehavior ct = inner3.getEnclosingBehavior();
+/* CtClass str = cp.get("java.lang.String");
CtClass cc = cp.get("Test");
cc.getClassFile().setMajorVersion(javassist.bytecode.ClassFile.JAVA_4);
CtMethod m = cc.getDeclaredMethod("bar");
@@ -16,7 +18,7 @@ public class Test {
m.insertAfter(" dismiss( aVar );" , true);
cc.getClassFile().setMajorVersion(javassist.bytecode.ClassFile.JAVA_7);
m.insertBefore("aVar = initVar();");
- cc.writeFile();
+ cc.writeFile();*/
}
public void bar(int i) { foo(i); }
diff --git a/src/test/javassist/JvstTest2.java b/src/test/javassist/JvstTest2.java
index ad039c8c..411c1e97 100644
--- a/src/test/javassist/JvstTest2.java
+++ b/src/test/javassist/JvstTest2.java
@@ -523,6 +523,17 @@ public class JvstTest2 extends JvstTestRoot {
assertEquals(out,
inner.getEnclosingMethod().getDeclaringClass());
}
+
+ assertNull(out.getEnclosingMethod());
+ assertNull(out.getEnclosingBehavior());
+
+ CtClass inner2 = sloader.get("test2.Anon$Anon2$1");
+ assertTrue(inner2.getEnclosingBehavior() instanceof CtConstructor);
+ assertEquals(sloader.get("test2.Anon$Anon2"), inner2.getEnclosingBehavior().getDeclaringClass());
+ CtClass inner3 = sloader.get("test2.Anon$Anon3$1");
+ assertTrue(inner3.getEnclosingBehavior() instanceof CtConstructor);
+ assertTrue(((CtConstructor)inner3.getEnclosingBehavior()).isClassInitializer());
+ assertEquals(sloader.get("test2.Anon$Anon3"), inner3.getEnclosingBehavior().getDeclaringClass());
}
public void testMethodInInner() throws Exception {
diff --git a/src/test/test2/Anon.java b/src/test/test2/Anon.java
index a6ccd8f0..56223436 100644
--- a/src/test/test2/Anon.java
+++ b/src/test/test2/Anon.java
@@ -4,4 +4,15 @@ public class Anon {
public Object make() {
return new Object() { int k; };
}
+
+ public static class Anon2 {
+ Object obj;
+ public Anon2() {
+ obj = new Object() { int k; };
+ }
+ }
+
+ public static class Anon3 {
+ public static Object sobj = new Object() { int p; };
+ }
}
--
2.39.5