12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- /* *******************************************************************
- * 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.lang.reflect;
-
- import java.lang.ref.WeakReference;
- import java.util.Collections;
- import java.util.Map;
- import java.util.WeakHashMap;
-
- import org.aspectj.internal.lang.reflect.AjTypeImpl;
-
- /**
- * This is the anchor for the AspectJ runtime type system.
- * Typical usage to get the AjType representation of a given type
- * at runtime is to call <code>AjType<Foo> fooType = AjTypeSystem.getAjType(Foo.class);</code>
- */
- public class AjTypeSystem {
-
- private static Map<Class, WeakReference<AjType>> ajTypes =
- Collections.synchronizedMap(new WeakHashMap<Class,WeakReference<AjType>>());
-
- /**
- * Return the AspectJ runtime type representation of the given Java type.
- * Unlike java.lang.Class, AjType understands pointcuts, advice, declare statements,
- * and other AspectJ type members. AjType is the recommended reflection API for
- * AspectJ programs as it offers everything that java.lang.reflect does, with
- * AspectJ-awareness on top.
- */
- public static <T> AjType<T> getAjType(Class<T> fromClass) {
- WeakReference<AjType> weakRefToAjType = ajTypes.get(fromClass);
- if (weakRefToAjType!=null) {
- AjType<T> theAjType = weakRefToAjType.get();
- if (theAjType != null) {
- return theAjType;
- } else {
- theAjType = new AjTypeImpl<T>(fromClass);
- ajTypes.put(fromClass, new WeakReference<AjType>(theAjType));
- return theAjType;
- }
- }
- // neither key nor value was found
- AjType<T> theAjType = new AjTypeImpl<T>(fromClass);
- ajTypes.put(fromClass, new WeakReference<AjType>(theAjType));
- return theAjType;
- }
- }
|