# AsmClassVisitorFactory

# AsmClassVisitorFactory

```
interface AsmClassVisitorFactory<ParametersT : InstrumentationParameters> : Serializable
```

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [com.android.build.api.instrumentation.AsmClassVisitorFactory](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#) |

A factory to create class visitor objects to instrument classes.

The implementation of this interface must be an abstract class where the[parameters](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#parameters:org.gradle.api.provider.Property)and[instrumentationContext](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#instrumentationContext:com.android.build.api.instrumentation.InstrumentationContext)are left unimplemented. The class must have an empty constructor which will be used to construct the factory object.

## Summary

|                                                                                                                                                                                                                                                                                                                                                                                                                                                                ### Public methods                                                                                                                                                                                                                                                                                                                                                                                                                                                                ||
|--------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| abstractClassVisitor                                                                       | [createClassVisitor](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#createClassVisitor(com.android.build.api.instrumentation.ClassContext,%20org.objectweb.asm.ClassVisitor))`(`classContext:` `[ClassContext](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/ClassContext)`, `nextClassVisitor:` `ClassVisitor`)` Creates a class visitor object that will visit a class with the given[classContext](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#com.android.build.api.instrumentation.AsmClassVisitorFactory$createClassVisitor(com.android.build.api.instrumentation.ClassContext,%20org.objectweb.asm.ClassVisitor)/classContext). |
| abstract[Boolean](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-boolean/index.html) | [isInstrumentable](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#isInstrumentable(com.android.build.api.instrumentation.ClassData))`(`classData:` `[ClassData](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/ClassData)`)` Whether the factory wants to instrument the class with the given[classData](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#com.android.build.api.instrumentation.AsmClassVisitorFactory$isInstrumentable(com.android.build.api.instrumentation.ClassData)/classData).                                                                                                                                         |

|                                                                                                                                                                                                                                      ### Properties                                                                                                                                                                                                                                       ||
|-------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| abstract[InstrumentationContext](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/InstrumentationContext) | [instrumentationContext](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#instrumentationContext:com.android.build.api.instrumentation.InstrumentationContext) Contains parameters to help instantiate the visitor objects.                         |
| abstract[Property](https://docs.gradle.org/current/javadoc/org/gradle/api/provider/Property.html)\<ParametersT\>                                            | [parameters](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#parameters:org.gradle.api.provider.Property) The parameters that will be instantiated, configured using the given config when registering the visitor, and injected on instantiation. |

## Public methods

### createClassVisitor

```
abstract fun createClassVisitor(
    classContext: ClassContext, 
    nextClassVisitor: ClassVisitor
): ClassVisitor
```

Creates a class visitor object that will visit a class with the given[classContext](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#com.android.build.api.instrumentation.AsmClassVisitorFactory$createClassVisitor(com.android.build.api.instrumentation.ClassContext,%20org.objectweb.asm.ClassVisitor)/classContext). The returned class visitor must delegate its calls to[nextClassVisitor](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#com.android.build.api.instrumentation.AsmClassVisitorFactory$createClassVisitor(com.android.build.api.instrumentation.ClassContext,%20org.objectweb.asm.ClassVisitor)/nextClassVisitor).

The given[classContext](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#com.android.build.api.instrumentation.AsmClassVisitorFactory$createClassVisitor(com.android.build.api.instrumentation.ClassContext,%20org.objectweb.asm.ClassVisitor)/classContext)contains static information about the classes before starting the instrumentation process. Any changes in interfaces or superclasses for the class with the given[classContext](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#com.android.build.api.instrumentation.AsmClassVisitorFactory$createClassVisitor(com.android.build.api.instrumentation.ClassContext,%20org.objectweb.asm.ClassVisitor)/classContext)or for any other class in its classpath by a previous visitor will not be reflected in the[classContext](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#com.android.build.api.instrumentation.AsmClassVisitorFactory$createClassVisitor(com.android.build.api.instrumentation.ClassContext,%20org.objectweb.asm.ClassVisitor)/classContext)object.

[classContext](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#com.android.build.api.instrumentation.AsmClassVisitorFactory$createClassVisitor(com.android.build.api.instrumentation.ClassContext,%20org.objectweb.asm.ClassVisitor)/classContext)can also be used to get the data for classes that are in the runtime classpath of the class being visited.

This method must handle asynchronous calls.

|                                                                                                                                                                                                                                      Parameters                                                                                                                                                                                                                                      ||
|----------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| classContext:[ClassContext](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/ClassContext) | contains information about the class that will be instrumented by the returned class visitor.                                                                                                                                                                                                                                          |
| nextClassVisitor:ClassVisitor                                                                                                                | the[ClassVisitor](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#)to which the created[ClassVisitor](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#)must delegate method calls. |

### isInstrumentable

```
abstract fun isInstrumentable(classData: ClassData): Boolean
```

Whether the factory wants to instrument the class with the given[classData](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#com.android.build.api.instrumentation.AsmClassVisitorFactory$isInstrumentable(com.android.build.api.instrumentation.ClassData)/classData).

If returned true,[createClassVisitor](https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/instrumentation/AsmClassVisitorFactory#createClassVisitor(com.android.build.api.instrumentation.ClassContext,%20org.objectweb.asm.ClassVisitor))will be called and the returned class visitor will visit the class.

This method must handle asynchronous calls.

## Properties

### instrumentationContext

```
abstract val instrumentationContext: InstrumentationContext
```

Contains parameters to help instantiate the visitor objects.

This field must be left unimplemented.  

### parameters

```
abstract val parameters: Property<ParametersT>
```

The parameters that will be instantiated, configured using the given config when registering the visitor, and injected on instantiation.

This field must be left unimplemented.