public BaseClassData(Class<?> cls) {
    className = cls.getName();
    internalName = Descriptor.toJvmName(cls.getName());
    this.loader = cls.getClassLoader();
    replaceable = false;
    if (cls.getSuperclass() != null) {
      superClassName = cls.getSuperclass().getName();
    } else {
      superClassName = null;
    }
    Set<MethodData> meths = new HashSet<MethodData>();
    for (Method m : cls.getDeclaredMethods()) {
      MemberType type = MemberType.NORMAL;
      final String descriptor = DescriptorUtils.getDescriptor(m);
      if ((descriptor.equals(Constants.ADDED_METHOD_DESCRIPTOR)
              && m.getName().equals(Constants.ADDED_METHOD_NAME))
          || (descriptor.equals(Constants.ADDED_STATIC_METHOD_DESCRIPTOR)
              && m.getName().equals(Constants.ADDED_STATIC_METHOD_NAME))) {
        type = MemberType.ADDED_SYSTEM;
      }
      MethodData md =
          new MethodData(m.getName(), descriptor, cls.getName(), type, m.getModifiers(), false);
      meths.add(md);
    }
    for (Constructor<?> c : cls.getDeclaredConstructors()) {
      MemberType type = MemberType.NORMAL;
      final String descriptor = DescriptorUtils.getDescriptor(c);
      if (descriptor.equals(Constants.ADDED_CONSTRUCTOR_DESCRIPTOR)) {
        type = MemberType.ADDED_SYSTEM;
      }
      MethodData md =
          new MethodData("<init>", descriptor, cls.getName(), type, c.getModifiers(), false);
      meths.add(md);
    }

    this.methods = Collections.unmodifiableSet(meths);
    Set<FieldData> fieldData = new HashSet<FieldData>();
    for (Field m : cls.getDeclaredFields()) {
      fieldData.add(new FieldData(m));
    }
    this.fields = Collections.unmodifiableSet(fieldData);
  }
  public BaseClassData(ClassFile file, ClassLoader loader, boolean replaceable) {
    className = file.getName();
    this.replaceable = replaceable;
    internalName = Descriptor.toJvmName(file.getName());
    this.loader = loader;
    superClassName = file.getSuperclass();
    boolean finalMethod = false;
    Set<MethodData> meths = new HashSet<MethodData>();
    for (Object o : file.getMethods()) {
      String methodClassName = className;
      MethodInfo m = (MethodInfo) o;
      MemberType type = MemberType.NORMAL;
      if ((m.getDescriptor().equals(Constants.ADDED_METHOD_DESCRIPTOR)
              && m.getName().equals(Constants.ADDED_METHOD_NAME))
          || (m.getDescriptor().equals(Constants.ADDED_STATIC_METHOD_DESCRIPTOR)
              && m.getName().equals(Constants.ADDED_STATIC_METHOD_NAME))
          || (m.getDescriptor().equals(Constants.ADDED_CONSTRUCTOR_DESCRIPTOR))) {
        type = MemberType.ADDED_SYSTEM;
      } else if (m.getAttribute(Constants.FINAL_METHOD_ATTRIBUTE) != null) {
        finalMethod = true;
      }

      MethodData md =
          new MethodData(
              m.getName(),
              m.getDescriptor(),
              methodClassName,
              type,
              m.getAccessFlags(),
              finalMethod);
      meths.add(md);
    }
    this.methods = Collections.unmodifiableSet(meths);
    Set<FieldData> fieldData = new HashSet<FieldData>();
    for (Object o : file.getFields()) {
      FieldInfo m = (FieldInfo) o;
      MemberType mt = MemberType.NORMAL;
      fieldData.add(new FieldData(m, mt, className, m.getAccessFlags()));
    }
    this.fields = Collections.unmodifiableSet(fieldData);
  }
 public MethodAdapter(MethodVisitor mv, boolean add, CtClass target) {
   super(mv);
   addSynchronized = add;
   this.target = target;
   targetOwner = Descriptor.toJvmName(target.getName());
 }