diff options
author | Glavo <zjx001202@126.com> | 2019-12-06 03:42:00 +0800 |
---|---|---|
committer | Glavo <zjx001202@126.com> | 2019-12-06 03:42:00 +0800 |
commit | e48c0668029849af07d1966729c5b703e89b1d00 (patch) | |
tree | fec378e2c6e52d86e601f0df45ba13728003fa2b /src/main/java/org/glavo/javah/ClassMetaInfo.java | |
parent | 6fd5804e3f2c337839efcf5c10426faed1d8b1af (diff) | |
download | gjavah-e48c0668029849af07d1966729c5b703e89b1d00.tar.gz gjavah-e48c0668029849af07d1966729c5b703e89b1d00.tar.bz2 gjavah-e48c0668029849af07d1966729c5b703e89b1d00.zip |
update
Diffstat (limited to 'src/main/java/org/glavo/javah/ClassMetaInfo.java')
-rw-r--r-- | src/main/java/org/glavo/javah/ClassMetaInfo.java | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/main/java/org/glavo/javah/ClassMetaInfo.java b/src/main/java/org/glavo/javah/ClassMetaInfo.java new file mode 100644 index 0000000..bc3ffcc --- /dev/null +++ b/src/main/java/org/glavo/javah/ClassMetaInfo.java @@ -0,0 +1,46 @@ +package org.glavo.javah; + +import org.objectweb.asm.*; + +import java.util.*; + +class ClassMetaInfo extends ClassVisitor { + final List<Constant> constants = new LinkedList<>(); + final List<NativeMethod> methods = new LinkedList<>(); + final Map<String, Integer> counts = new HashMap<>(); + + ClassName superClassName; + ClassName name; + + public ClassMetaInfo() { + super(Opcodes.ASM7); + } + + @Override + public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { + this.superClassName = superName == null ? null : ClassName.of(superName.replace('/', '.')); + this.name = ClassName.of(name.replace('/', '.')); + } + + @Override + public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { + counts.put(name, counts.getOrDefault(name, 0) + 1); + if ((access & Opcodes.ACC_NATIVE) != 0) { + this.methods.add(NativeMethod.of(access, name, descriptor)); + } + return null; + } + + @Override + public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) { + if (value != null && !(value instanceof String)) { + constants.add(Constant.of(name, value)); + } + return null; + } + + boolean isOverloadMethod(NativeMethod method) { + Objects.requireNonNull(method); + return counts.getOrDefault(method.name(), 1) > 1; + } +} |