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);
}
}