in src/main/java/org/apache/cassandra/distributed/shared/InstanceClassLoader.java [140:208]
protected Class<?> findClass(String name) throws ClassNotFoundException
{
if (transform == null)
return super.findClass(name);
String pkg = name.substring(0, name.lastIndexOf('.'));
String path = name.replace('.', '/').concat(".class");
URL url = getResource(path);
if (url == null)
{
byte[] bytes = transform.transform(name, null);
if (bytes == null)
throw new ClassNotFoundException(name);
if (null == getPackage(pkg))
definePackage(pkg, null, null, null, null, null, null, null);
return defineClass(name, bytes, 0, bytes.length);
}
try
{
URLConnection connection = url.openConnection();
CodeSigner[] codeSigners = null;
Manifest manifest = null;
if (connection instanceof JarURLConnection)
{
manifest = ((JarURLConnection) connection).getManifest();
codeSigners = ((JarURLConnection) connection).getJarEntry().getCodeSigners();
}
if (null == getPackage(pkg))
{
try
{
if (manifest != null) definePackage(pkg, manifest, url);
else definePackage(pkg, null, null, null, null, null, null, null);
}
catch (IllegalArgumentException iae)
{
if (null == getPackage(pkg))
throw iae;
}
}
try (InputStream in = connection.getInputStream())
{
byte[] bytes = new byte[in.available()];
int cur, total = 0;
while (0 <= (cur = in.read(bytes, total, bytes.length - total)))
{
total += cur;
if (cur == 0 && total == bytes.length)
{
int next = in.read();
if (next < 0)
break;
bytes = Arrays.copyOf(bytes, bytes.length * 2);
bytes[total++] = (byte)next;
}
}
if (total < bytes.length)
bytes = Arrays.copyOf(bytes, total);
bytes = transform.transform(name, bytes);
return defineClass(name, bytes, 0, bytes.length, new CodeSource(url, codeSigners));
}
}
catch (Throwable t)
{
throw new ClassNotFoundException(name, t);
}
}