1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved. 2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This program and the accompanying materials are made available under 4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the terms of the Common Public License v1.0 which accompanies this distribution, 5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * and is available at http://www.eclipse.org/legal/cpl-v10.html 6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * $Id: ClassLoaderResolver.java,v 1.1.1.1.2.2 2004/07/10 03:34:53 vlad_r Exp $ 8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.util; 10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ---------------------------------------------------------------------------- 12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/** 13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This non-instantiable non-subclassable class acts as the global point for 14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * choosing a ClassLoader for dynamic class/resource loading at any point 15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * in an application. 16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @see ResourceLoader 18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @see IClassLoadStrategy 19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @see DefaultClassLoadStrategy 20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2003 22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic 24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectabstract class ClassLoaderResolver 25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{ 26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // public: ................................................................ 27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // NOTE: don't use Logger in this class to avoid infinite recursion 29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This method selects the "best" classloader instance to be used for 32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * class/resource loading by whoever calls this method. The decision 33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * typically involves choosing between the caller's current, thread context, 34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * system, and other classloaders in the JVM and is made by the {@link IClassLoadStrategy} 35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * instance established by the last call to {@link #setStrategy}.<P> 36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This method does not throw. 38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @param caller [null input eliminates the caller's current classloader 40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * from consideration] 41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @return classloader to be used by the caller ['null' indicates the 43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * primordial loader] 44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static synchronized ClassLoader getClassLoader (final Class caller) 46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final ClassLoadContext ctx = new ClassLoadContext (caller); 48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return s_strategy.getClassLoader (ctx); 50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This method selects the "best" classloader instance to be used for 54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * class/resource loading by whoever calls this method. The decision 55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * typically involves choosing between the caller's current, thread context, 56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * system, and other classloaders in the JVM and is made by the {@link IClassLoadStrategy} 57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * instance established by the last call to {@link #setStrategy}.<P> 58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This method uses its own caller to set the call context. To be able to 60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * override this decision explicitly, use {@link #getClassLoader(Class)}.<P> 61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This method does not throw. 63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @return classloader to be used by the caller ['null' indicates the 65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * primordial loader] 66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static synchronized ClassLoader getClassLoader () 68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final Class caller = getCallerClass (1); // 'caller' can be set to null 70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final ClassLoadContext ctx = new ClassLoadContext (caller); 71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return s_strategy.getClassLoader (ctx); 73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /* 76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Indexes into the current method call context with a given offset. Offset 0 77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * corresponds to the immediate caller, offset 1 corresponds to its caller, 78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * etc.<P> 79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Invariant: getCallerClass(0) == class containing code that performs this call 81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static Class getCallerClass (final int callerOffset) 83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (CALLER_RESOLVER == null) return null; // only happens if <clinit> failed 85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return CALLER_RESOLVER.getClassContext () [CALL_CONTEXT_OFFSET + callerOffset]; 87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Returns 'true' if 'loader2' is a delegation child of 'loader1' [or if 91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 'loader1'=='loader2']. Of course, this works only for classloaders that 92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * set their parent pointers correctly. 'null' is interpreted as the 93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * primordial loader [i.e., everybody's parent]. 94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static boolean isChild (final ClassLoader loader1, ClassLoader loader2) 96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (loader1 == loader2) return true; 98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (loader2 == null) return false; 99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (loader1 == null) return true; 100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for ( ; loader2 != null; loader2 = loader2.getParent ()) 102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (loader2 == loader1) return true; 104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return false; 107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Gets the current classloader selection strategy setting. 111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static synchronized IClassLoadStrategy getStrategy () 113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return s_strategy; 115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Sets the classloader selection strategy to be used by subsequent calls 119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * to {@link #getClassLoader()}. An instance of {@link ClassLoaderResolver.DefaultClassLoadStrategy} 120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * is in effect if this method is never called. 121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @param strategy new strategy [may not be null] 123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @return previous setting 124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static synchronized IClassLoadStrategy setStrategy (final IClassLoadStrategy strategy) 126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (strategy == null) throw new IllegalArgumentException ("null input: strategy"); 128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IClassLoadStrategy old = s_strategy; 130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project s_strategy = strategy; 131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return old; 133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // protected: ............................................................. 136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // package: ............................................................... 138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // private: ............................................................... 140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final class DefaultClassLoadStrategy implements IClassLoadStrategy 143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public ClassLoader getClassLoader (final ClassLoadContext ctx) 145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (ctx == null) throw new IllegalArgumentException ("null input: ctx"); 147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final Class caller = ctx.getCallerClass (); 149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final ClassLoader contextLoader = Thread.currentThread ().getContextClassLoader (); 150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project ClassLoader result; 152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (caller == null) 154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result = contextLoader; 155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final ClassLoader callerLoader = caller.getClassLoader (); 158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // if 'callerLoader' and 'contextLoader' are in a parent-child 160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // relationship, always choose the child: 161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // SF BUG 975080: change the sibling case to use 'callerLoader' 163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // to work around ANT 1.6.x incorrect classloading model: 164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (isChild (callerLoader, contextLoader)) 166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result = contextLoader; 167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result = callerLoader; 169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final ClassLoader systemLoader = ClassLoader.getSystemClassLoader (); 172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // precaution for when deployed as a bootstrap or extension class: 174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (isChild (result, systemLoader)) 175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result = systemLoader; 176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return result; 178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } // end of nested class 181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * A helper class to get the call context. It subclasses SecurityManager 185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * to make getClassContext() accessible. An instance of CallerResolver 186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * only needs to be created, not installed as an actual security 187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * manager. 188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final class CallerResolver extends SecurityManager 190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project protected Class [] getClassContext () 192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return super.getClassContext (); 194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } // end of nested class 197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private ClassLoaderResolver () {} // prevent subclassing 200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static IClassLoadStrategy s_strategy; // initialized in <clinit> 203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final int CALL_CONTEXT_OFFSET = 2; // may need to change if this class is redesigned 205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final CallerResolver CALLER_RESOLVER; // set in <clinit> 206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project //private static Throwable CLINIT_FAILURE; 207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project static 209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project CallerResolver temp = null; 211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project try 212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // this can fail if the current SecurityManager does not allow 214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // RuntimePermission ("createSecurityManager"): 215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project temp = new CallerResolver (); 217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project catch (Throwable t) 219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project //CLINIT_FAILURE = t; 221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project CALLER_RESOLVER = temp; 223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project s_strategy = new DefaultClassLoadStrategy (); 225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class 228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------