001package io.ebean.enhance.entity; 002 003import io.ebean.enhance.common.ClassBytesReader; 004import io.ebean.enhance.common.InputStreamTransform; 005import io.ebean.enhance.common.UrlHelper; 006 007import java.io.IOException; 008import java.io.InputStream; 009import java.net.URL; 010import java.net.URLClassLoader; 011 012/** 013 * Implementation of ClassBytesReader based on URLClassLoader. 014 */ 015public class ClassPathClassBytesReader implements ClassBytesReader { 016 017 private final URL[] urls; 018 019 public ClassPathClassBytesReader(URL[] urls) { 020 this.urls = urls == null ? new URL[0] : urls; 021 } 022 023 @Override 024 public byte[] getClassBytes(String className, ClassLoader classLoader) { 025 try (URLClassLoader cl = new URLClassLoader(urls, classLoader)) { 026 String resource = className.replace('.', '/') + ".class"; 027 URL url = cl.getResource(resource); 028 if (url == null) { 029 return null; 030 } 031 032 try (InputStream is = UrlHelper.openNoCache(url)) { 033 return InputStreamTransform.readBytes(is); 034 035 } catch (IOException e) { 036 throw new RuntimeException("IOException reading bytes for " + className, e); 037 } 038 } catch (IOException e) { 039 throw new RuntimeException("Error closing URLClassLoader for " + className, e); 040 } 041 } 042 043}