ClassAdapter.groovy 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package com.gradle.ares
  2. import org.gradle.api.Project
  3. import org.gradle.api.logging.Logger
  4. import org.gradle.api.logging.Logging
  5. import org.objectweb.asm.ClassVisitor
  6. import org.objectweb.asm.FieldVisitor
  7. import org.objectweb.asm.MethodVisitor
  8. import org.objectweb.asm.Opcodes
  9. /**
  10. * Created by Glen on 2017/2/8.
  11. */
  12. public class ClassAdapter extends ClassVisitor {
  13. private Project project;
  14. private Logger logger;
  15. private boolean modify;
  16. private String name;
  17. private String superName;
  18. private String[] interfaces;
  19. private Set<Agent> addAgents;
  20. public ClassAdapter(ClassVisitor cv, Project project) {
  21. super(Opcodes.ASM5, cv)
  22. this.project = project
  23. this.logger = Logging.getLogger(ClassAdapter.class)
  24. }
  25. @Override
  26. public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
  27. super.visit(version, access, name, signature, superName, interfaces)
  28. this.name = name
  29. this.superName = superName
  30. this.interfaces = interfaces
  31. debug("class:" + name + "_" + superName + "_" + interfaces)
  32. }
  33. @Override
  34. public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
  35. MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions)
  36. def agent = MethodAgentVisitor.getAgent(access, name, desc)
  37. if (agent != null) {
  38. modify = true
  39. debug("method:" + access + "_" + name + "_" + desc)
  40. mv = new MethodAgentVisitor(mv, agent)
  41. }
  42. agent = MethodLifeCycleVisitor.getAgent(superName, access, name, desc)
  43. if (agent != null) {
  44. debug("lifecycle:" + access + "_" + name + "_" + desc)
  45. if (addAgents == null) addAgents = new HashSet<>();
  46. addAgents.add(agent)
  47. modify = true
  48. mv = new MethodLifeCycleVisitor(mv, name, agent)
  49. }
  50. return mv
  51. }
  52. @Override
  53. FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
  54. return super.visitField(access, name, desc, signature, value)
  55. }
  56. @Override
  57. void visitEnd() {
  58. if (addAgents != null) {
  59. MethodLifeCycleVisitor.addMethods(addAgents, name, superName, this.cv)
  60. }
  61. super.visitEnd()
  62. }
  63. boolean getModify() {
  64. return modify
  65. }
  66. private void debug(def msg) {
  67. this.logger.lifecycle(":" + this.project.name + ":" + msg)
  68. }
  69. }