# AsmClassVisitorFactory

# AsmClassVisitorFactory

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

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [com.android.build.api.instrumentation.AsmClassVisitorFactory](https://developer.android.com/reference/tools/gradle-api/4.2/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/4.2/com/android/build/api/instrumentation/AsmClassVisitorFactory#parameters:org.gradle.api.provider.Property)and[instrumentationContext](https://developer.android.com/reference/tools/gradle-api/4.2/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.

This API is experimental and subject to breaking change and we strongly suggest you don't publish plugins that depend on it yet.

## Summary

|                                                                                                                                                                                                                                                                                                                                                                                                                                                                ### Public methods                                                                                                                                                                                                                                                                                                                                                                                                                                                                ||
|--------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| abstractClassVisitor                                                                       | [createClassVisitor](https://developer.android.com/reference/tools/gradle-api/4.2/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/4.2/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/4.2/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/4.2/com/android/build/api/instrumentation/AsmClassVisitorFactory#isInstrumentable(com.android.build.api.instrumentation.ClassData))`(`classData:` `[ClassData](https://developer.android.com/reference/tools/gradle-api/4.2/com/android/build/api/instrumentation/ClassData)`)` Whether or not the factory wants to instrument the class with the given[classData](https://developer.android.com/reference/tools/gradle-api/4.2/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/4.2/com/android/build/api/instrumentation/InstrumentationContext) | [instrumentationContext](https://developer.android.com/reference/tools/gradle-api/4.2/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/4.2/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/4.2/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/4.2/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/4.2/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/4.2/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/4.2/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/4.2/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/4.2/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/4.2/com/android/build/api/instrumentation/AsmClassVisitorFactory#)to which the created[ClassVisitor](https://developer.android.com/reference/tools/gradle-api/4.2/com/android/build/api/instrumentation/AsmClassVisitorFactory#)must delegate method calls. |

### isInstrumentable

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

Whether or not the factory wants to instrument the class with the given[classData](https://developer.android.com/reference/tools/gradle-api/4.2/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/4.2/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.