org.apache.felix.ipojo.manipulation

## Class ClassChecker

- java.lang.Object
- - org.objectweb.asm.ClassVisitor
  - - org.apache.felix.ipojo.manipulation.ClassChecker

All Implemented Interfaces:
  org.objectweb.asm.Opcodes

    public class ClassChecker
    extends org.objectweb.asm.ClassVisitor
    implements org.objectweb.asm.Opcodes

Checks that a POJO is already manipulated or not. Moreover it allows to get manipulation data about this class.

Author:
  Felix Project Team

### Nested Class Summary

Nested Classes
`class` `ClassChecker.AnnotationDescriptor` Describes a method or constructor annotation.
`class` `ClassChecker.ArrayAttribute` Describes an array attribute.
`static class` `ClassChecker.EnumAttribute` Describes an attribute.
`static class` `ClassChecker.SimpleAttribute` Describes a simple attribute.

### Field Summary

### Fields inherited from class org.objectweb.asm.ClassVisitor

`api, cv`

### Fields inherited from interface org.objectweb.asm.Opcodes

`AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V9`

### Constructor Summary

Constructors
Constructor and Description
`ClassChecker()`

### Method Summary

All Methods Static Methods Instance Methods Concrete Methods
`String` `getClassName()`
`int` `getClassVersion()` Gets the extracted class version
`Map<String,String>` `getFields()` Get collected fields.
`Set<String>` `getFinalFields()`
`Collection<String>` `getInnerClasses()`
`Map<String,List<MethodDescriptor>>` `getInnerClassesAndMethods()`
`List<String>` `getInterfaces()` Get collected interfaces.
`List<MethodDescriptor>` `getMethods()` Get collected methods.
`String` `getSuperClass()`
`boolean` `isAlreadyManipulated()` Check if the class was already manipulated.
`static boolean` `isFirstArgumentInstanceManager(String desc)`
`static boolean` `isGeneratedConstructor(String name, String desc)`
`static boolean` `isGeneratedMethod(String name, String desc)`
`void` `visit(int version, int access, String name, String signature, String superName, String[] interfaces)` Visit the class.
`org.objectweb.asm.FieldVisitor` `visitField(int access, String name, String desc, String signature, Object value)` Check if the _cm field already exists.
`void` `visitInnerClass(String name, String outerName, String innerName, int access)` Add the inner class to the list of inner class to manipulate.
`org.objectweb.asm.MethodVisitor` `visitMethod(int access, String name, String desc, String signature, String[] exceptions)` Visit a method.

### Methods inherited from class org.objectweb.asm.ClassVisitor

`getDelegate, visitAnnotation, visitAttribute, visitEnd, visitModule, visitNestHost, visitNestMember, visitOuterClass, visitPermittedSubclass, visitRecordComponent, visitSource, visitTypeAnnotation`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Constructor Detail

#### ClassChecker

    public ClassChecker()

### Method Detail

#### visitField

    public org.objectweb.asm.FieldVisitor visitField(int access,
                                                     String name,
                                                     String desc,
                                                     String signature,
                                                     Object value)

Check if the _cm field already exists. Update the field list.

Overrides:
  `visitField` in class `org.objectweb.asm.ClassVisitor`
Parameters:
  `access` - : access of the field
  `name` - : name of the field
  `desc` - : description of the field
  `signature` - : signature of the field
  `value` - : value of the field (for static field only)
Returns:
  the field visitor
See Also:
  `ClassVisitor.visitField(int, java.lang.String, java.lang.String, java.lang.String, java.lang.Object)`

#### visitInnerClass

    public void visitInnerClass(String name,
                                String outerName,
                                String innerName,
                                int access)

Add the inner class to the list of inner class to manipulate. The method checks that the inner class is really owned by the implementation class.

Overrides:
  `visitInnerClass` in class `org.objectweb.asm.ClassVisitor`
Parameters:
  `name` - inner class qualified name
  `outerName` - outer class name (may be null for anonymous class)
  `innerName` - inner class simple (i.e. short) name
  `access` - inner class visibility
See Also:
  `ClassVisitor.visitInnerClass(java.lang.String, java.lang.String, java.lang.String, int)`

#### isAlreadyManipulated

    public boolean isAlreadyManipulated()

Check if the class was already manipulated.

Returns:
  true if the class is already manipulated.

#### getClassVersion

    public int getClassVersion()

Gets the extracted class version

Returns:
  the class version.

#### visit

    public void visit(int version,
                      int access,
                      String name,
                      String signature,
                      String superName,
                      String[] interfaces)

Visit the class. Update the implemented interface list.

Overrides:
  `visit` in class `org.objectweb.asm.ClassVisitor`
Parameters:
  `version` - : version of the class
  `access` - : access of the class
  `name` - : name of the class
  `signature` - : signature of the class
  `superName` - : super class of the class
  `interfaces` - : implemented interfaces.
See Also:
  `ClassVisitor.visit(int, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])`

#### visitMethod

    public org.objectweb.asm.MethodVisitor visitMethod(int access,
                                                       String name,
                                                       String desc,
                                                       String signature,
                                                       String[] exceptions)

Visit a method. Update the method list (except if it init or clinit.

Overrides:
  `visitMethod` in class `org.objectweb.asm.ClassVisitor`
Parameters:
  `access` - - the method's access flags (see Opcodes). This parameter also indicates if the method is synthetic and/or deprecated.
  `name` - - the method's name.
  `desc` - - the method's descriptor (see Type).
  `signature` - - the method's signature. May be null if the method parameters, return type and exceptions do not use generic types.
  `exceptions` - - the internal names of the method's exception classes (see getInternalName). May be null.
Returns:
  nothing.
See Also:
  `ClassVisitor.visitMethod(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])`

#### isGeneratedConstructor

    public static boolean isGeneratedConstructor(String name,
                                                 String desc)

#### isFirstArgumentInstanceManager

    public static boolean isFirstArgumentInstanceManager(String desc)

#### isGeneratedMethod

    public static boolean isGeneratedMethod(String name,
                                            String desc)

#### getInterfaces

    public List<String> getInterfaces()

Get collected interfaces.

Returns:
  the interfaces implemented by the component class.

#### getFields

    public Map<String,String> getFields()

Get collected fields.

Returns:
  the field map [field_name, type].

#### getFinalFields

    public Set<String> getFinalFields()

#### getMethods

    public List<MethodDescriptor> getMethods()

Get collected methods.

Returns:
  the method list of [method, signature].

#### getSuperClass

    public String getSuperClass()

#### getInnerClasses

    public Collection<String> getInnerClasses()

#### getInnerClassesAndMethods

    public Map<String,List<MethodDescriptor>> getInnerClassesAndMethods()

#### getClassName

    public String getClassName()