com.github.andyshao.reflect.SignatureDetector Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of Gear Show documentation
Show all versions of Gear Show documentation
Enhance and formating the coding of JDK
The newest version!
package com.github.andyshao.reflect;
import com.github.andyshao.asm.TypeOperation;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodVisitor;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
*
* Title:
* Descript:
* Copyright: Copryright(c) Feb 17, 2016
* Encoding:UNIX UTF-8
*
* @author Andy.Shao
*
*/
public class SignatureDetector extends ClassVisitor {
/**
* Class signature
*/
public static class ClassSignature {
/**class signature*/
public String classSignature;
/**clazz*/
public Class> clazz;
/**field signatures*/
public final Map fieldSignatures = new HashMap<>();
/**inner class signatures*/
public final Map , ClassSignature> innerClassSignatures = new HashMap<>();
/**method signature*/
public final Map methodSignatures = new HashMap<>();
@Override
public String toString() {
return "ClassSignature [clazz=" + this.clazz + ", classSignature=" + this.classSignature + ", fieldSignatures=" + this.fieldSignatures + ", innerClassSignatures="
+ this.innerClassSignatures + ", methodSignatures=" + this.methodSignatures + "]";
}
}
private int api;
private volatile ClassSignature signature = new SignatureDetector.ClassSignature();
/**
* build {@link SignatureDetector}
* @param api api
*/
public SignatureDetector(int api) {
super(api);
this.api = api;
}
/**
* get signature
* @param clazz {@link Class}
* @return {@link ClassSignature}
*/
public ClassSignature getSignature(Class> clazz) {
ClassReader cr;
try {
cr = new ClassReader(clazz.getName());
} catch (IOException e) {
throw new ClassNotFoundException(clazz.getName(), e);
}
this.signature.clazz = clazz;
cr.accept(this , 0);
return this.signature;
}
/**
* get signature
* @param clazz class type
* @param inputStream class file input stream (Sometime, the inputStream is hard to get)
* @return return type
*/
public ClassSignature getSignature(Class> clazz, InputStream inputStream) {
ClassReader cr;
try {
cr = new ClassReader(inputStream);
} catch (IOException e) {
throw new ClassNotFoundException(e);
}
this.signature.clazz = clazz;
cr.accept(this, 0);
return this.signature;
}
/**
* refresh
*/
public void refresh() {
this.signature = new SignatureDetector.ClassSignature();
}
@Override
public void visit(int version , int access , String name , String signature , String superName , String[] interfaces) {
this.signature.classSignature = signature;
super.visit(version , access , name , signature , superName , interfaces);
}
@Override
public FieldVisitor visitField(int access , String name , String desc , String signature , Object value) {
if (signature != null) this.signature.fieldSignatures.put(FieldOperation.superGetDeclaredField(this.signature.clazz , name) , signature);
return super.visitField(access , name , desc , signature , value);
}
@Override
public void visitInnerClass(String name , String outerName , String innerName , int access) {
Class> innerClass = ClassOperation.forName(name.replace('/' , '.'));
if (isTrueInnerClass(innerClass)) this.signature.innerClassSignatures.put(innerClass , new SignatureDetector(this.api).getSignature(innerClass));
super.visitInnerClass(name , outerName , innerName , access);
}
private boolean isTrueInnerClass(Class> innerClass) {
// return !innerClass.equals(this.signature.clazz);
return this.signature.clazz.equals(innerClass.getSuperclass());
}
@Override
public MethodVisitor visitMethod(int access , String name , String desc , String signature , String[] exceptions) {
if (signature != null) {
if(Objects.equals(name , "")); // ignore
else this.signature.methodSignatures.put(TypeOperation.getMethod(desc , name , this.signature.clazz) , signature);
}
return super.visitMethod(access , name , desc , signature , exceptions);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy