/*
* Copyright 2016, Stuart Douglas, and individual contributors as indicated
* by the @authors tag.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.fakereplace.reflection;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.fakereplace.manip.Manipulator;
/**
* Helper utility class for setting up the reflection call replacements.
*/
public class ReflectionInstrumentationSetup {
private static final String CLASS = Class.class.getName();
public static final String METHOD = Method.class.getName();
public static final String CONSTRUCTOR = Constructor.class.getName();
public static final String FIELD = Field.class.getName();
public static final String ANNOTATED_ELEMENT = AnnotatedElement.class.getName();
public static final String ANNOTATION_REFLECTION = AnnotationReflection.class.getName();
public static final String METHOD_REFLECTION = MethodReflection.class.getName();
public static final String FIELD_REFLECTION = FieldReflection.class.getName();
public static final String CONSTRUCTOR_REFLECTION = ConstructorReflection.class.getName();
public static void setup(Manipulator manipulator) {
// initilize the reflection manipulation
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, METHOD_REFLECTION, "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", "(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, METHOD_REFLECTION, "getDeclaredMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", "(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, METHOD_REFLECTION, "getMethods", "()[Ljava/lang/reflect/Method;", "(Ljava/lang/Class;)[Ljava/lang/reflect/Method;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, METHOD_REFLECTION, "getDeclaredMethods", "()[Ljava/lang/reflect/Method;", "(Ljava/lang/Class;)[Ljava/lang/reflect/Method;", null);
// constructors
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, CONSTRUCTOR_REFLECTION, "getConstructor", "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;", "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/reflect/Constructor;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, CONSTRUCTOR_REFLECTION, "getDeclaredConstructor", "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;", "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/reflect/Constructor;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, CONSTRUCTOR_REFLECTION, "getConstructors", "()[Ljava/lang/reflect/Constructor;", "(Ljava/lang/Class;)[Ljava/lang/reflect/Constructor;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, CONSTRUCTOR_REFLECTION, "getDeclaredConstructors", "()[Ljava/lang/reflect/Constructor;", "(Ljava/lang/Class;)[Ljava/lang/reflect/Constructor;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(METHOD, METHOD_REFLECTION, "getDeclaringClass", "()Ljava/lang/Class;", "(Ljava/lang/reflect/Method;)Ljava/lang/Class;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CONSTRUCTOR, CONSTRUCTOR_REFLECTION, "getDeclaringClass", "()Ljava/lang/Class;", "(Ljava/lang/reflect/Constructor;)Ljava/lang/Class;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(FIELD, FIELD_REFLECTION, "getDeclaringClass", "()Ljava/lang/Class;", "(Ljava/lang/reflect/Field;)Ljava/lang/Class;", null);
// class level annotations
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, ANNOTATION_REFLECTION, "isAnnotationPresent", "(Ljava/lang/Class;)Z", "(Ljava/lang/Class;Ljava/lang/Class;)Z", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, ANNOTATION_REFLECTION, "getAnnotation", "(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;", "(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/annotation/Annotation;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, ANNOTATION_REFLECTION, "getAnnotations", "()[Ljava/lang/annotation/Annotation;", "(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, ANNOTATION_REFLECTION, "getDeclaredAnnotations", "()[Ljava/lang/annotation/Annotation;", "(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;", null);
// field level annotations
manipulator.replaceVirtualMethodInvokationWithStatic(FIELD, ANNOTATION_REFLECTION, "isAnnotationPresent", "(Ljava/lang/Class;)Z", "(Ljava/lang/reflect/Field;Ljava/lang/Class;)Z", null);
manipulator.replaceVirtualMethodInvokationWithStatic(FIELD, ANNOTATION_REFLECTION, "getAnnotation", "(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;", "(Ljava/lang/reflect/Field;Ljava/lang/Class;)Ljava/lang/annotation/Annotation;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(FIELD, ANNOTATION_REFLECTION, "getAnnotations", "()[Ljava/lang/annotation/Annotation;", "(Ljava/lang/reflect/Field;)[Ljava/lang/annotation/Annotation;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(FIELD, ANNOTATION_REFLECTION, "getDeclaredAnnotations", "()[Ljava/lang/annotation/Annotation;", "(Ljava/lang/reflect/Field;)[Ljava/lang/annotation/Annotation;", null);
// method level annotations
manipulator.replaceVirtualMethodInvokationWithStatic(METHOD, ANNOTATION_REFLECTION, "isAnnotationPresent", "(Ljava/lang/Class;)Z", "(Ljava/lang/reflect/Method;Ljava/lang/Class;)Z", null);
manipulator.replaceVirtualMethodInvokationWithStatic(METHOD, ANNOTATION_REFLECTION, "getAnnotation", "(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;", "(Ljava/lang/reflect/Method;Ljava/lang/Class;)Ljava/lang/annotation/Annotation;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(METHOD, ANNOTATION_REFLECTION, "getAnnotations", "()[Ljava/lang/annotation/Annotation;", "(Ljava/lang/reflect/Method;)[Ljava/lang/annotation/Annotation;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(METHOD, ANNOTATION_REFLECTION, "getDeclaredAnnotations", "()[Ljava/lang/annotation/Annotation;", "(Ljava/lang/reflect/Method;)[Ljava/lang/annotation/Annotation;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(METHOD, ANNOTATION_REFLECTION, "getParameterAnnotations", "()[[Ljava/lang/annotation/Annotation;", "(Ljava/lang/reflect/Method;)[[Ljava/lang/annotation/Annotation;", null);
// constructor level annotations
manipulator.replaceVirtualMethodInvokationWithStatic(CONSTRUCTOR, ANNOTATION_REFLECTION, "isAnnotationPresent", "(Ljava/lang/Class;)Z", "(Ljava/lang/reflect/Constructor;Ljava/lang/Class;)Z", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CONSTRUCTOR, ANNOTATION_REFLECTION, "getAnnotation", "(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;", "(Ljava/lang/reflect/Constructor;Ljava/lang/Class;)Ljava/lang/annotation/Annotation;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CONSTRUCTOR, ANNOTATION_REFLECTION, "getAnnotations", "()[Ljava/lang/annotation/Annotation;", "(Ljava/lang/reflect/Constructor;)[Ljava/lang/annotation/Annotation;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CONSTRUCTOR, ANNOTATION_REFLECTION, "getDeclaredAnnotations", "()[Ljava/lang/annotation/Annotation;", "(Ljava/lang/reflect/Constructor;)[Ljava/lang/annotation/Annotation;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CONSTRUCTOR, ANNOTATION_REFLECTION, "getParameterAnnotations", "()[[Ljava/lang/annotation/Annotation;", "(Ljava/lang/reflect/Constructor;)[[Ljava/lang/annotation/Annotation;", null);
// AnnotatedElement
manipulator.replaceVirtualMethodInvokationWithStatic(ANNOTATED_ELEMENT, ANNOTATION_REFLECTION, "isAnnotationPresent", "(Ljava/lang/Class;)Z", "(Ljava/lang/reflect/AnnotatedElement;Ljava/lang/Class;)Z", null);
manipulator.replaceVirtualMethodInvokationWithStatic(ANNOTATED_ELEMENT, ANNOTATION_REFLECTION, "getAnnotation", "(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;", "(Ljava/lang/reflect/AnnotatedElement;Ljava/lang/Class;)Ljava/lang/annotation/Annotation;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(ANNOTATED_ELEMENT, ANNOTATION_REFLECTION, "getAnnotations", "()[Ljava/lang/annotation/Annotation;", "(Ljava/lang/reflect/AnnotatedElement;)[Ljava/lang/annotation/Annotation;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(ANNOTATED_ELEMENT, ANNOTATION_REFLECTION, "getDeclaredAnnotations", "()[Ljava/lang/annotation/Annotation;", "(Ljava/lang/reflect/AnnotatedElement;)[Ljava/lang/annotation/Annotation;", null);
// method modifiers
manipulator.replaceVirtualMethodInvokationWithStatic(METHOD, METHOD_REFLECTION, "getModifiers", "()I", "(Ljava/lang/reflect/Method;)I", null);
// fields
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, FIELD_REFLECTION, "getField", "(Ljava/lang/String;)Ljava/lang/reflect/Field;", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, FIELD_REFLECTION, "getDeclaredField", "(Ljava/lang/String;)Ljava/lang/reflect/Field;", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, FIELD_REFLECTION, "getFields", "()[Ljava/lang/reflect/Field;", "(Ljava/lang/Class;)[Ljava/lang/reflect/Field;", null);
manipulator.replaceVirtualMethodInvokationWithStatic(CLASS, FIELD_REFLECTION, "getDeclaredFields", "()[Ljava/lang/reflect/Field;", "(Ljava/lang/Class;)[Ljava/lang/reflect/Field;", null);
}
private ReflectionInstrumentationSetup () {
}
}