/* *******************************************************************
 * Copyright (c) 2005 Contributors.
 * All rights reserved. 
 * This program and the accompanying materials are made available 
 * under the terms of the Eclipse Public License v1.0 
 * which accompanies this distribution and is available at 
 * http://eclipse.org/legal/epl-v10.html 
 *  
 * Contributors: 
 *   Adrian Colyer			Initial implementation
 * ******************************************************************/
package org.aspectj.weaver.reflect;

import java.lang.reflect.Member;

import org.aspectj.weaver.ResolvedType;
import org.aspectj.weaver.ast.Var;

A variable at a reflection shadow, used by the residual tests.
/** * A variable at a reflection shadow, used by the residual tests. */
public final class ReflectionVar extends Var { static final int THIS_VAR = 0; static final int TARGET_VAR = 1; static final int ARGS_VAR = 2; static final int AT_THIS_VAR = 3; static final int AT_TARGET_VAR = 4; static final int AT_ARGS_VAR = 5; static final int AT_WITHIN_VAR = 6; static final int AT_WITHINCODE_VAR = 7; static final int AT_ANNOTATION_VAR = 8; private AnnotationFinder annotationFinder = null; // static { // try { // Class java15AnnotationFinder = Class.forName("org.aspectj.weaver.reflect.Java15AnnotationFinder"); // annotationFinder = (AnnotationFinder) java15AnnotationFinder.newInstance(); // } catch(ClassNotFoundException ex) { // // must be on 1.4 or earlier // } catch(IllegalAccessException ex) { // // not so good // throw new RuntimeException("AspectJ internal error",ex); // } catch(InstantiationException ex) { // throw new RuntimeException("AspectJ internal error",ex); // } // } private int argsIndex = 0; private int varType; public static ReflectionVar createThisVar(ResolvedType type,AnnotationFinder finder) { ReflectionVar ret = new ReflectionVar(type,finder); ret.varType = THIS_VAR; return ret; } public static ReflectionVar createTargetVar(ResolvedType type, AnnotationFinder finder) { ReflectionVar ret = new ReflectionVar(type,finder); ret.varType = TARGET_VAR; return ret; } public static ReflectionVar createArgsVar(ResolvedType type, int index, AnnotationFinder finder) { ReflectionVar ret = new ReflectionVar(type,finder); ret.varType = ARGS_VAR; ret.argsIndex = index; return ret; } public static ReflectionVar createThisAnnotationVar(ResolvedType type, AnnotationFinder finder) { ReflectionVar ret = new ReflectionVar(type,finder); ret.varType = AT_THIS_VAR; return ret; } public static ReflectionVar createTargetAnnotationVar(ResolvedType type, AnnotationFinder finder) { ReflectionVar ret = new ReflectionVar(type,finder); ret.varType = AT_TARGET_VAR; return ret; } public static ReflectionVar createArgsAnnotationVar(ResolvedType type, int index, AnnotationFinder finder) { ReflectionVar ret = new ReflectionVar(type,finder); ret.varType = AT_ARGS_VAR; ret.argsIndex = index; return ret; } public static ReflectionVar createWithinAnnotationVar(ResolvedType annType, AnnotationFinder finder) { ReflectionVar ret = new ReflectionVar(annType,finder); ret.varType = AT_WITHIN_VAR; return ret; } public static ReflectionVar createWithinCodeAnnotationVar(ResolvedType annType, AnnotationFinder finder) { ReflectionVar ret = new ReflectionVar(annType,finder); ret.varType = AT_WITHINCODE_VAR; return ret; } public static ReflectionVar createAtAnnotationVar(ResolvedType annType, AnnotationFinder finder) { ReflectionVar ret = new ReflectionVar(annType,finder); ret.varType = AT_ANNOTATION_VAR; return ret; } private ReflectionVar(ResolvedType type,AnnotationFinder finder) { super(type); this.annotationFinder = finder; } public Object getBindingAtJoinPoint(Object thisObject, Object targetObject, Object[] args) { return getBindingAtJoinPoint(thisObject,targetObject,args,null,null,null); }
At a join point with the given this, target, and args, return the object to which this var is bound.
Params:
  • thisObject –
  • targetObject –
  • args –
Returns:
/** * At a join point with the given this, target, and args, return the object to which this * var is bound. * @param thisObject * @param targetObject * @param args * @return */
public Object getBindingAtJoinPoint( Object thisObject, Object targetObject, Object[] args, Member subject, Member withinCode, Class withinType) { switch( this.varType) { case THIS_VAR: return thisObject; case TARGET_VAR: return targetObject; case ARGS_VAR: if (this.argsIndex > (args.length - 1)) return null; return args[argsIndex]; case AT_THIS_VAR: if (annotationFinder != null) { return annotationFinder.getAnnotation(getType(), thisObject); } else return null; case AT_TARGET_VAR: if (annotationFinder != null) { return annotationFinder.getAnnotation(getType(), targetObject); } else return null; case AT_ARGS_VAR: if (this.argsIndex > (args.length - 1)) return null; if (annotationFinder != null) { return annotationFinder.getAnnotation(getType(), args[argsIndex]); } else return null; case AT_WITHIN_VAR: if (annotationFinder != null) { return annotationFinder.getAnnotationFromClass(getType(), withinType); } else return null; case AT_WITHINCODE_VAR: if (annotationFinder != null) { return annotationFinder.getAnnotationFromMember(getType(), withinCode); } else return null; case AT_ANNOTATION_VAR: if (annotationFinder != null) { return annotationFinder.getAnnotationFromMember(getType(), subject); } else return null; } return null; } }