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// ----------------------------------------------------------------------------