public static Class copyClass()

in aws-lambda-java-serialization/src/main/java/com/amazonaws/services/lambda/runtime/serialization/util/ReflectUtil.java [49:79]


    public static Class<?> copyClass(Class<?> clazz, ClassLoader cl) {
        // if class exists in target class loader then just load that class and return
        try {
            return cl.loadClass(clazz.getName());
        } catch (ClassNotFoundException e) {}
        // copy class to target class loader
        LambdaByteArrayOutputStream stream;
        // 1 kb
        final int chunkSize = 1024;
        final String resourceName = clazz.getName().replace('.', '/') + ".class";
        try(InputStream input = clazz.getClassLoader().getResourceAsStream(resourceName)) {
            int initial = Math.max(chunkSize, input.available());
            stream = new LambdaByteArrayOutputStream(initial);
            stream.readAll(input);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
        // load class from target class loader
        try {
            Functions.R5<Class<?>, ClassLoader, String, byte[], Integer, Integer> defineClassMethod =
                    ReflectUtil.loadInstanceR4(ClassLoader.class, "defineClass", true,
                            (Class<Class<?>>)(Class)Class.class, String.class, byte[].class, int.class, int.class);
            Class<?> result = defineClassMethod.call(cl, clazz.getName(), stream.getRawBuf(), 0, stream.getValidByteCount());
            V2<ClassLoader, Class<?>> resolveClass =
                    ReflectUtil.loadInstanceV1(ClassLoader.class, "resolveClass", true, Class.class);
            resolveClass.call(cl, result);
            return result;
        } catch (ClassFormatError | SecurityException e) {
            throw new ReflectException(e);
        }
    }