| // Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file | 
 | // for details. All rights reserved. Use of this source code is governed by a | 
 | // BSD-style license that can be found in the LICENSE file. | 
 | package classloader; | 
 |  | 
 | import java.lang.reflect.Method; | 
 |  | 
 | import dalvik.system.PathClassLoader; | 
 |  | 
 | // Command line application which take three arguments: | 
 | // | 
 | //  Parent dex file | 
 | //  Child dex file | 
 | //  Main class name | 
 | // | 
 | // The application will create a classloader hierachy with the parent dex file above the | 
 | // system class loader, and the child dex file above the parent dex file. The it will load the | 
 | // Main class from the child dex file class loader and run its main method. | 
 | public class Runner { | 
 |   public static void main(String[] args) throws Exception { | 
 |     String parentFile = args[0]; | 
 |     String childFile = args[1]; | 
 |     String childClassName = args[2]; | 
 |     ClassLoader parentClassLoader = | 
 |         new PathClassLoader(parentFile, ClassLoader.getSystemClassLoader()); | 
 |     ClassLoader childClassLoader = new PathClassLoader(childFile, parentClassLoader); | 
 |  | 
 |     Class<?> childClass = childClassLoader.loadClass(childClassName); | 
 |     runMain(childClass, new String[0]); | 
 |   } | 
 |  | 
 |   private static void runMain(Class<?> clazz, String[] args) throws Exception { | 
 |     Method m = clazz.getMethod("main", String[].class); | 
 |     m.invoke(null, new Object[] { args }); | 
 |   } | 
 | } |