Skip to content

Maven plugin that will apply Javassist bytecode transformations during build time.

License

Notifications You must be signed in to change notification settings

stephanenicolas/javassist-maven-plugin

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

47 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Javassist Maven Plugin

A simple Maven plugin that can apply Javassist tranformation on classes after compilation.

How to use it

Include the plugin on your pom.xml descriptor:


	<plugin>
		<groupId>com.github.drochetti</groupId>
		<artifactId>javassist-maven-plugin</artifactId>
		<version>1.0.0-SNAPSHOT</version>
		<configuration>
			<includeTestClasses>false</includeTestClasses>
			<transformerClasses>
				<transformerClass>
				    <className>com.domain.ToStringTransformer</className>
				    <properties>
				        <property>
				            <name>append.value</name>
				            <value> and ToStringTransformer</value>
				        </property>
				    </properties>
				</transformerClass>
			</transformerClasses>
		</configuration>
		<executions>
			<execution>
				<phase>process-classes</phase>
				<goals>
					<goal>javassist</goal>
				</goals>
			</execution>
		</executions>
	</plugin>

You must implement Class transformers, here’s one simple example (at least, not a “logger” one).


/**
 * Silly transformer, used to hack the toString method.
 */
public class ToStringTransformer extends ClassTransformer {

    private static final String = APPEND_VALUE_PROPERTY_KEY = "append.value"; 

    private String appendValue;

	/**
	 * We'll only transform subtypes of MyInterface.
	 */
	@Override
	protected boolean filter(CtClass candidateClass) throws Exception {
		CtClass myInterface = ClassPool.getDefault().get(MyInterface.class.getName());
		return !candidateClass.equals(myInterface) && candidateClass.subtypeOf(myInterface);
	}

	/**
	 * Hack the toString() method.
	 */
	@Override
	protected void applyTransformations(CtClass classToTransform) throws Exception {
		// Actually you must test if it exists, but it's just an example...
		CtMethod toStringMethod = classToTransform.getDeclaredMethod("toString");
		classToTransform.removeMethod(toStringMethod);

		CtMethod hackedToStringMethod = CtNewMethod.make(
				"public String toString() { return \"toString() hacked by Javassist"+(this.appendValue != null ? this.appendValue:"")+"\"; }",
				classToTransform);
		classToTransform.addMethod(hackedToStringMethod);
	}

    /**
     * 
     */
    @Override
    protected void configure(final Properties properties) {
        if( null == properties ) {
            return;
        }
        this.appendValue = properties.getProperty(APPEND_VALUE_PROPERTY_KEY);
    }
}

Known limitations

  • Not published on Maven Central or Sonatype OSS repos yet (Critical);
  • Don’t instrument classes inside .jar files, only classes on your project;
  • Lack of unit tests and sample app;
  • Further implementations of com.github.drochetti.javassist.maven.ClassTransformer can enable easier interactions with the Javassist API (provide some utilities).

How to contribute?

If you think this project is useful for you, them there’s a huge chance it’s useful to others, so please feel free
to fork, fix it, improve it and test it (the “Known limitations” above is a great way to start).

About

Maven plugin that will apply Javassist bytecode transformations during build time.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 99.8%
  • Groovy 0.2%