use of org.mvel2.asm.ClassReader in project drools by kiegroup.
the class MethodComparator method getMethodBytecode.
/**
* This will return a series of bytecode instructions which can be used to compare one method with another.
* debug info like local var declarations and line numbers are ignored, so the focus is on the content.
*/
public static List getMethodBytecode(final String methodName, final byte[] bytes) {
final Tracer visit = new Tracer(methodName);
final ClassReader classReader = new ClassReader(bytes);
classReader.accept(visit, ClassReader.SKIP_DEBUG);
return visit.getText();
}
use of org.mvel2.asm.ClassReader in project drools by kiegroup.
the class MethodComparerTest method testMethodCompare.
@Test
public void testMethodCompare() throws Exception {
final MethodComparator comp = new MethodComparator();
boolean result = comp.equivalent("evaluate", new ClassReader(getClassData(MethodCompareA.class)), "evaluate", new ClassReader(getClassData(MethodCompareB.class)));
assertEquals(true, result);
result = comp.equivalent("evaluate", new ClassReader(getClassData(MethodCompareA.class)), "evaluate2", new ClassReader(getClassData(MethodCompareA.class)));
assertEquals(false, result);
result = comp.equivalent("evaluate", new ClassReader(getClassData(MethodCompareB.class)), "evaluate2", new ClassReader(getClassData(MethodCompareA.class)));
assertEquals(false, result);
result = comp.equivalent("evaluate", new ClassReader(getClassData(MethodCompareB.class)), "evaluate", new ClassReader(getClassData(MethodCompareA.class)));
assertEquals(true, result);
result = comp.equivalent("evaluate", new ClassReader(getClassData(MethodCompareA.class)), "evaluate", new ClassReader(getClassData(MethodCompareA.class)));
assertEquals(true, result);
result = comp.equivalent("evaluate", new ClassReader(getClassData(MethodCompareA.class)), "askew", new ClassReader(getClassData(MethodCompareA.class)));
assertEquals(false, result);
}
use of org.mvel2.asm.ClassReader in project drools by kiegroup.
the class LambdaIntrospector method getFingerprintsForClass.
private static Map<String, String> getFingerprintsForClass(Object lambda, SerializedLambda extracted) {
ClassLoader lambdaClassLoader = lambda.getClass().getClassLoader();
String className = extracted.getCapturingClass();
ClassIdentifier id = new ClassIdentifier(lambdaClassLoader, className);
Map<String, String> fingerprints = methodFingerprintsMap.get(id);
if (fingerprints == null) {
LambdaIntrospector.LambdaClassVisitor visitor = new LambdaIntrospector.LambdaClassVisitor();
try (InputStream classStream = lambdaClassLoader.getResourceAsStream(className.replace('.', '/') + ".class")) {
ClassReader reader = new ClassReader(classStream);
reader.accept(visitor, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
} catch (Exception e) {
throw new RuntimeException(e);
}
fingerprints = visitor.getMethodsMap();
methodFingerprintsMap.put(id, fingerprints);
}
return fingerprints;
}
use of org.mvel2.asm.ClassReader in project drools by kiegroup.
the class ClassFieldInspector method processClassWithByteCode.
/**
* Walk up the inheritance hierarchy recursively, reading in fields
*/
private void processClassWithByteCode(final Class<?> clazz, final InputStream stream, final boolean includeFinalMethods) throws IOException {
final ClassReader reader = new ClassReader(stream);
final ClassFieldVisitor visitor = new ClassFieldVisitor(clazz, includeFinalMethods, this);
reader.accept(visitor, 0);
if (clazz.getSuperclass() != null) {
final String name = getResourcePath(clazz.getSuperclass());
final InputStream parentStream = clazz.getResourceAsStream(name);
if (parentStream != null) {
try {
processClassWithByteCode(clazz.getSuperclass(), parentStream, includeFinalMethods);
} finally {
parentStream.close();
}
} else {
processClassWithoutByteCode(clazz.getSuperclass(), includeFinalMethods);
}
}
if (clazz.isInterface()) {
final Class<?>[] interfaces = clazz.getInterfaces();
for (Class<?> anInterface : interfaces) {
final String name = getResourcePath(anInterface);
final InputStream parentStream = clazz.getResourceAsStream(name);
if (parentStream != null) {
try {
processClassWithByteCode(anInterface, parentStream, includeFinalMethods);
} finally {
parentStream.close();
}
} else {
processClassWithoutByteCode(anInterface, includeFinalMethods);
}
}
}
}
Aggregations