# AsmClassVisitorFactory

# AsmClassVisitorFactory

<br />

```
public interface AsmClassVisitorFactory<ParametersT extends InstrumentationParameters> extends Serializable
```

<br />

*** ** * ** ***

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/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#parameters())and[instrumentationContext](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#instrumentationContext())are left unimplemented. The class must have an empty constructor which will be used to construct the factory object.

## Summary

|                                                                                                                                                             ### Public methods                                                                                                                                                              |
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `abstract @`[NonNull](https://developer.android.com/reference/tools/gradle-api/8.3/null/androidx/annotation/NonNull)` `[ClassVisitor](https://asm.ow2.io/javadoc/org/objectweb/asm/ClassVisitor.html)                                                                                                                                       | [createClassVisitor](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#createClassVisitor(com.android.build.api.instrumentation.ClassContext,org.objectweb.asm.ClassVisitor))`(` ` @`[NonNull](https://developer.android.com/reference/tools/gradle-api/8.3/null/androidx/annotation/NonNull)` `[ClassContext](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/ClassContext)` classContext,` ` @`[NonNull](https://developer.android.com/reference/tools/gradle-api/8.3/null/androidx/annotation/NonNull)` `[ClassVisitor](https://asm.ow2.io/javadoc/org/objectweb/asm/ClassVisitor.html)` nextClassVisitor` `)` Creates a class visitor object that will visit a class with the given[classContext](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#createClassVisitor(com.android.build.api.instrumentation.ClassContext,org.objectweb.asm.ClassVisitor)). |
| `abstract @`[NonNull](https://developer.android.com/reference/tools/gradle-api/8.3/null/androidx/annotation/NonNull)` `[InstrumentationContext](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/InstrumentationContext)                                                             | `@`[Nested](https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/Nested.html) [getInstrumentationContext](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#getInstrumentationContext())`()` Contains parameters to help instantiate the visitor objects.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| `abstract @`[NonNull](https://developer.android.com/reference/tools/gradle-api/8.3/null/androidx/annotation/NonNull)` `[Property](https://docs.gradle.org/current/javadoc/org/gradle/api/provider/Property.html)`<@`[NonNull](https://developer.android.com/reference/tools/gradle-api/8.3/null/androidx/annotation/NonNull)` ParametersT>` | `@`[Nested](https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/Nested.html) [getParameters](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#getParameters())`()` The parameters that will be instantiated, configured using the given config when registering the visitor, and injected on instantiation.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| `abstract boolean`                                                                                                                                                                                                                                                                                                                          | [isInstrumentable](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#isInstrumentable(com.android.build.api.instrumentation.ClassData))`(@`[NonNull](https://developer.android.com/reference/tools/gradle-api/8.3/null/androidx/annotation/NonNull)` `[ClassData](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/ClassData)` classData)` Whether the factory wants to instrument the class with the given[classData](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#isInstrumentable(com.android.build.api.instrumentation.ClassData)).                                                                                                                                                                                                                                                                                                                     |

## Public methods

### createClassVisitor

```
abstract @NonNull ClassVisitor createClassVisitor(
    @NonNull ClassContext classContext,
    @NonNull ClassVisitor nextClassVisitor
)
```

Creates a class visitor object that will visit a class with the given[classContext](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#createClassVisitor(com.android.build.api.instrumentation.ClassContext,org.objectweb.asm.ClassVisitor)). The returned class visitor must delegate its calls to[nextClassVisitor](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#createClassVisitor(com.android.build.api.instrumentation.ClassContext,org.objectweb.asm.ClassVisitor)). If at this point the factory is not interested in instrumenting the class with given[classContext](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#createClassVisitor(com.android.build.api.instrumentation.ClassContext,org.objectweb.asm.ClassVisitor)), then return[nextClassVisitor](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#createClassVisitor(com.android.build.api.instrumentation.ClassContext,org.objectweb.asm.ClassVisitor)).

The given[classContext](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#createClassVisitor(com.android.build.api.instrumentation.ClassContext,org.objectweb.asm.ClassVisitor))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/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#createClassVisitor(com.android.build.api.instrumentation.ClassContext,org.objectweb.asm.ClassVisitor))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/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#createClassVisitor(com.android.build.api.instrumentation.ClassContext,org.objectweb.asm.ClassVisitor))object.

[classContext](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/AsmClassVisitorFactory#createClassVisitor(com.android.build.api.instrumentation.ClassContext,org.objectweb.asm.ClassVisitor))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                                                                                                                             |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `@`[NonNull](https://developer.android.com/reference/tools/gradle-api/8.3/null/androidx/annotation/NonNull)` `[ClassContext](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/instrumentation/ClassContext)` classContext` | contains information about the class that will be instrumented by the returned class visitor.                                                                                                                  |
| `@`[NonNull](https://developer.android.com/reference/tools/gradle-api/8.3/null/androidx/annotation/NonNull)` `[ClassVisitor](https://asm.ow2.io/javadoc/org/objectweb/asm/ClassVisitor.html)` nextClassVisitor`                                                   | the[ClassVisitor](https://asm.ow2.io/javadoc/org/objectweb/asm/ClassVisitor.html)to which the created[ClassVisitor](https://asm.ow2.io/javadoc/org/objectweb/asm/ClassVisitor.html)must delegate method calls. |

### getInstrumentationContext

```
@Nested
abstract @NonNull InstrumentationContext getInstrumentationContext()
```

Contains parameters to help instantiate the visitor objects.

This field must be left unimplemented.  

### getParameters

```
@Nested
abstract @NonNull Property<@NonNull ParametersT> getParameters()
```

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.  

### isInstrumentable

```
abstract boolean isInstrumentable(@NonNull ClassData classData)
```

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

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

This method must handle asynchronous calls.