Skip to content

Commit 2bfb43b

Browse files
committed
Move resolving class name from bytecode to ClassHierarchy
1 parent 6622492 commit 2bfb43b

File tree

10 files changed

+81
-216
lines changed

10 files changed

+81
-216
lines changed

net.tascalate.javaflow.providers.asm3/src/main/java/org/apache/commons/javaflow/providers/asm3/ClassHierarchy.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,18 @@ public String getCommonSuperClass(String type1, String type2) {
7878
return result;
7979
}
8080

81+
public static String resolveClassName(String className, Class<?> classBeingRedefined, byte[] classfileBuffer) {
82+
String resolvedClassName = className != null ? className :
83+
classBeingRedefined != null ? classBeingRedefined.getName().replace('.', '/') : null;
84+
85+
if (null == resolvedClassName) {
86+
ClassReader cv = new ClassReader(classfileBuffer);
87+
return cv.getClassName();
88+
} else {
89+
return resolvedClassName;
90+
}
91+
}
92+
8193
Type getCommonSuperType(Type type1, Type type2) {
8294
return Type.getObjectType(getCommonSuperClass(type1.getInternalName(), type2.getInternalName()));
8395
}

net.tascalate.javaflow.providers.asm3/src/main/java/org/apache/commons/javaflow/providers/asm3/ClassNameResolver.java

Lines changed: 0 additions & 48 deletions
This file was deleted.

net.tascalate.javaflow.providers.asm4/src/main/java/org/apache/commons/javaflow/providers/asm4/ClassHierarchy.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,18 @@ public String getCommonSuperClass(String type1, String type2) {
7878
return result;
7979
}
8080

81+
public static String resolveClassName(String className, Class<?> classBeingRedefined, byte[] classfileBuffer) {
82+
String resolvedClassName = className != null ? className :
83+
classBeingRedefined != null ? classBeingRedefined.getName().replace('.', '/') : null;
84+
85+
if (null == resolvedClassName) {
86+
ClassReader cv = new ClassReader(classfileBuffer);
87+
return cv.getClassName();
88+
} else {
89+
return resolvedClassName;
90+
}
91+
}
92+
8193
Type getCommonSuperType(Type type1, Type type2) {
8294
return Type.getObjectType(getCommonSuperClass(type1.getInternalName(), type2.getInternalName()));
8395
}

net.tascalate.javaflow.providers.asm4/src/main/java/org/apache/commons/javaflow/providers/asm4/ClassNameResolver.java

Lines changed: 0 additions & 48 deletions
This file was deleted.

net.tascalate.javaflow.providers.asm5/src/main/java/org/apache/commons/javaflow/providers/asm5/ClassHierarchy.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,18 @@ public String getCommonSuperClass(String type1, String type2) {
7878
return result;
7979
}
8080

81+
public static String resolveClassName(String className, Class<?> classBeingRedefined, byte[] classfileBuffer) {
82+
String resolvedClassName = className != null ? className :
83+
classBeingRedefined != null ? classBeingRedefined.getName().replace('.', '/') : null;
84+
85+
if (null == resolvedClassName) {
86+
ClassReader cv = new ClassReader(classfileBuffer);
87+
return cv.getClassName();
88+
} else {
89+
return resolvedClassName;
90+
}
91+
}
92+
8193
Type getCommonSuperType(Type type1, Type type2) {
8294
return Type.getObjectType(getCommonSuperClass(type1.getInternalName(), type2.getInternalName()));
8395
}

net.tascalate.javaflow.providers.asm5/src/main/java/org/apache/commons/javaflow/providers/asm5/ClassNameResolver.java

Lines changed: 0 additions & 48 deletions
This file was deleted.

net.tascalate.javaflow.providers.asmx/src/main/java/org/apache/commons/javaflow/providers/asmx/ClassHierarchy.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,18 @@ public String getCommonSuperClass(String type1, String type2) {
7878
return result;
7979
}
8080

81+
public static String resolveClassName(String className, Class<?> classBeingRedefined, byte[] classfileBuffer) {
82+
String resolvedClassName = className != null ? className :
83+
classBeingRedefined != null ? classBeingRedefined.getName().replace('.', '/') : null;
84+
85+
if (null == resolvedClassName) {
86+
ClassReader cv = new ClassReader(classfileBuffer);
87+
return cv.getClassName();
88+
} else {
89+
return resolvedClassName;
90+
}
91+
}
92+
8193
Type getCommonSuperType(Type type1, Type type2) {
8294
return Type.getObjectType(getCommonSuperClass(type1.getInternalName(), type2.getInternalName()));
8395
}

net.tascalate.javaflow.providers.asmx/src/main/java/org/apache/commons/javaflow/providers/asmx/ClassNameResolver.java

Lines changed: 0 additions & 48 deletions
This file was deleted.

net.tascalate.javaflow.tools.cdi-javaagent/src/main/java/org/apache/commons/javaflow/instrumentation/cdi/CdiProxyClassTransformer.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import java.security.ProtectionDomain;
2222
import java.util.ArrayList;
23+
import java.util.Collections;
2324
import java.util.List;
2425
import java.util.Map;
2526
import java.util.WeakHashMap;
@@ -41,7 +42,6 @@
4142

4243
import org.apache.commons.javaflow.providers.asmx.AsmxResourceTransformationFactory;
4344
import org.apache.commons.javaflow.providers.asmx.ClassHierarchy;
44-
import org.apache.commons.javaflow.providers.asmx.ClassNameResolver;
4545

4646
public class CdiProxyClassTransformer implements ClassFileTransformer {
4747
private static final Logger log = LoggerFactory.getLogger(CdiProxyClassTransformer.class);
@@ -52,9 +52,9 @@ public class CdiProxyClassTransformer implements ClassFileTransformer {
5252
// @Override
5353
public byte[] transform(
5454
ClassLoader classLoader,
55-
final String className,
56-
final Class<?> classBeingRedefined,
57-
final ProtectionDomain protectionDomain,
55+
String className,
56+
Class<?> classBeingRedefined,
57+
ProtectionDomain protectionDomain,
5858
final byte[] classfileBuffer) throws IllegalClassFormatException {
5959

6060
if (isSystemClassLoaderParent(classLoader)) {
@@ -64,14 +64,18 @@ public byte[] transform(
6464
return null;
6565
}
6666

67+
// Ensure classLoader is not null (null for boot class loader)
6768
classLoader = getSafeClassLoader(classLoader);
69+
// Ensure className is not null (parameter is null for dynamically defined classes like lambdas)
70+
className = ClassHierarchy.resolveClassName(className, classBeingRedefined, classfileBuffer);
71+
6872
Object[] helpers = getCachedHelpers(classLoader);
6973
final ContinuableClassInfoResolver resolver = (ContinuableClassInfoResolver)helpers[0];
7074
final ClassHierarchy hierarchy = (ClassHierarchy)helpers[1];
7175
@SuppressWarnings("unchecked")
7276
final List<ProxyType> proxyTypes = (List<ProxyType>)helpers[2];
77+
7378
synchronized (resolver) {
74-
final ClassNameResolver.Result currentTarget = ClassNameResolver.resolveClassName(className, classBeingRedefined, classfileBuffer);
7579
try {
7680
// Execute with current class as extra resource (in-memory)
7781
// Mandatory for Java8 lambdas and alike
@@ -85,16 +89,16 @@ public byte[] call() {
8589
return writer.toByteArray();
8690
}
8791
},
88-
currentTarget.asResource()
92+
Collections.singletonMap(className + ".class", classfileBuffer)
8993
);
9094
} catch (StopException ex) {
9195
return null;
9296
} catch (RuntimeException ex) {
9397
if (log.isErrorEnabled()) {
9498
if (VERBOSE_ERROR_REPORTS) {
95-
log.error("Error transforming " + currentTarget.className, ex);
99+
log.error("Error transforming " + className, ex);
96100
} else {
97-
log.error("Error transforming " + currentTarget.className);
101+
log.error("Error transforming " + className);
98102
}
99103
}
100104
return null;

0 commit comments

Comments
 (0)