use of jodd.asm5.ClassReader in project jodd by oblac.
the class TargetClassInfoReader method visitEnd.
/**
* Stores signatures for all super public methods not already overridden by target class.
* All this methods will be accepted for proxyfication.
*/
@Override
public void visitEnd() {
// prepare class annotations
if (classAnnotations != null) {
annotations = classAnnotations.toArray(new AnnotationInfo[classAnnotations.size()]);
classAnnotations = null;
}
List<String> superList = new ArrayList<>();
Set<String> allInterfaces = new HashSet<>();
if (nextInterfaces != null) {
allInterfaces.addAll(nextInterfaces);
}
// check all public super methods that are not overridden in superclass
while (nextSupername != null) {
InputStream inputStream = null;
ClassReader cr = null;
try {
inputStream = ClassLoaderUtil.getClassAsStream(nextSupername, classLoader);
cr = new ClassReader(inputStream);
} catch (IOException ioex) {
throw new ProxettaException("Unable to inspect super class: " + nextSupername, ioex);
} finally {
StreamUtil.close(inputStream);
}
superList.add(nextSupername);
// remember the super class reader
superClassReaders.add(cr);
cr.accept(new SuperClassVisitor(), 0);
if (cr.getInterfaces() != null) {
Collections.addAll(allInterfaces, cr.getInterfaces());
}
}
superClasses = superList.toArray(new String[superList.size()]);
// check all interface methods that are not overridden in super-interface
for (String next : allInterfaces) {
InputStream inputStream = null;
ClassReader cr = null;
try {
inputStream = ClassLoaderUtil.getClassAsStream(next, classLoader);
cr = new ClassReader(inputStream);
} catch (IOException ioex) {
throw new ProxettaException("Unable to inspect super interface: " + next, ioex);
} finally {
StreamUtil.close(inputStream);
}
// remember the super class reader
superClassReaders.add(cr);
cr.accept(new SuperClassVisitor(), 0);
}
}
use of jodd.asm5.ClassReader in project jodd by oblac.
the class ProxettaBuilder method process.
/**
* Reads the target and creates destination class.
*/
protected void process() {
if (targetInputStream == null) {
throw new ProxettaException("Target missing");
}
// create class reader
ClassReader classReader;
try {
classReader = new ClassReader(targetInputStream);
} catch (IOException ioex) {
throw new ProxettaException("Error reading class input stream", ioex);
}
// reads information
TargetClassInfoReader targetClassInfoReader = new TargetClassInfoReader(proxetta.getClassLoader());
classReader.accept(targetClassInfoReader, 0);
this.destClassWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
// create proxy
if (log.isDebugEnabled()) {
log.debug("processing: " + classReader.getClassName());
}
WorkData wd = process(classReader, targetClassInfoReader);
// store important data
proxyApplied = wd.proxyApplied;
proxyClassName = wd.thisReference.replace('/', '.');
}
use of jodd.asm5.ClassReader in project apex-core by apache.
the class FastClassIndexReaderTest method testIndexReader.
@Test
public void testIndexReader() throws IOException {
String javahome = System.getProperty("java.home");
String jdkJar = javahome + "/lib/rt.jar";
JarFile jar = new JarFile(jdkJar);
java.util.Enumeration<JarEntry> entriesEnum = jar.entries();
while (entriesEnum.hasMoreElements()) {
JarEntry jarEntry = entriesEnum.nextElement();
if (jarEntry.getName().endsWith("class")) {
InputStream ins = jar.getInputStream(jarEntry);
ClassReader classReader = new ClassReader(ins);
ClassNodeType classN = new ClassNodeType();
classReader.accept(classN, ClassReader.SKIP_CODE);
CompactClassNode ccn = CompactUtil.compactClassNode(classN);
ins.close();
ins = jar.getInputStream(jarEntry);
FastClassIndexReader fastClassIndexReader = new FastClassIndexReader(ins);
Assert.assertEquals("The wrong class is " + classN.name, classN.name, fastClassIndexReader.getName());
Assert.assertEquals("The wrong class is " + classN.name, classN.superName, fastClassIndexReader.getSuperName());
Assert.assertEquals("The wrong class is " + classN.name, !ASMUtil.isAbstract(classN.access) && ASMUtil.isPublic(classN.access) && ccn.getDefaultConstructor() != null, fastClassIndexReader.isInstantiable());
Assert.assertArrayEquals("The wrong class is " + classN.name, classN.interfaces.toArray(), fastClassIndexReader.getInterfaces());
}
}
}
use of jodd.asm5.ClassReader in project tomee by apache.
the class AnnotationFinder method readClassDef.
private void readClassDef(String className, final ClassVisitor visitor) {
classes++;
if (!className.endsWith(".class")) {
className = className.replace('.', '/') + ".class";
}
try {
final URL resource = classLoader.getResource(className);
if (resource != null) {
InputStream in = resource.openStream();
in = new BufferedInputStream(in);
try {
final ClassReader classReader = new ClassReader(in);
classReader.accept(visitor, ASM_FLAGS);
} finally {
in.close();
}
} else {
new Exception("Could not load " + className).printStackTrace();
}
} catch (final IOException e) {
e.printStackTrace();
}
}
use of jodd.asm5.ClassReader in project tomee by apache.
the class TempClassLoader method isAnnotationClass.
/**
* Fast-parse the given class bytecode to determine if it is an
* annotation class.
*/
private static boolean isAnnotationClass(final byte[] bytes) {
final IsAnnotationVisitor isAnnotationVisitor = new IsAnnotationVisitor();
final ClassReader classReader = new ClassReader(bytes);
classReader.accept(isAnnotationVisitor, ClassReader.SKIP_DEBUG);
return isAnnotationVisitor.isAnnotation;
}
Aggregations