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 026 try (URLClassLoader cl = new URLClassLoader(urls, classLoader)) { 027 String resource = className.replace('.', '/') + ".class"; 028 URL url = cl.getResource(resource); 029 if (url == null) { 030 return null; 031 } 032 033 try (InputStream is = UrlHelper.openNoCache(url)) { 034 return InputStreamTransform.readBytes(is); 035 036 } catch (IOException e) { 037 throw new RuntimeException("IOException reading bytes for " + className, e); 038 } 039 } catch (IOException e) { 040 throw new RuntimeException("Error closing URLClassLoader for " + className, e); 041 } 042 } 043 044}