mirror of
https://github.com/corda/corda.git
synced 2025-01-07 13:38:47 +00:00
b96cc3c575
Lots has changed since we forked Android's libcore, so merging the latest upstream code has required extensive changes to the Avian/Android port. One big change is that we now use Avian's versions of java.lang.Object, java.lang.Class, java.lang.ClassLoader, some java.lang.reflect.* classes, etc. instead of the Android versions. The main reason is that the Android versions have become very Dex/Dalvik-specific, and since Avian is based on Java class files, not dex archives, that code doesn't make sense here. This has the side benefit that we can share more native code with classpath-avian.cpp and reduce the amount of Java/C++ code duplication.
214 lines
5.4 KiB
Java
214 lines
5.4 KiB
Java
/* Copyright (c) 2008-2014, Avian Contributors
|
|
|
|
Permission to use, copy, modify, and/or distribute this software
|
|
for any purpose with or without fee is hereby granted, provided
|
|
that the above copyright notice and this permission notice appear
|
|
in all copies.
|
|
|
|
There is NO WARRANTY for this software. See license.txt for
|
|
details. */
|
|
|
|
package java.lang;
|
|
|
|
import java.io.InputStream;
|
|
import java.io.IOException;
|
|
import java.net.URL;
|
|
import java.util.ArrayList;
|
|
import java.util.Collection;
|
|
import java.util.Collections;
|
|
import java.util.Enumeration;
|
|
import java.util.Map;
|
|
import java.util.HashMap;
|
|
import java.security.ProtectionDomain;
|
|
|
|
public abstract class ClassLoader {
|
|
private final ClassLoader parent;
|
|
private Map<String, Package> packages;
|
|
|
|
protected ClassLoader(ClassLoader parent) {
|
|
if (parent == null) {
|
|
this.parent = getSystemClassLoader();
|
|
} else {
|
|
this.parent = parent;
|
|
}
|
|
}
|
|
|
|
protected ClassLoader() {
|
|
this(getSystemClassLoader());
|
|
}
|
|
|
|
private Map<String, Package> packages() {
|
|
if (packages == null) {
|
|
packages = new HashMap();
|
|
}
|
|
return packages;
|
|
}
|
|
|
|
protected Package getPackage(String name) {
|
|
synchronized (this) {
|
|
return packages().get(name);
|
|
}
|
|
}
|
|
|
|
protected Package[] getPackages() {
|
|
synchronized (this) {
|
|
return packages().values().toArray(new Package[packages().size()]);
|
|
}
|
|
}
|
|
|
|
protected Package definePackage(String name,
|
|
String specificationTitle,
|
|
String specificationVersion,
|
|
String specificationVendor,
|
|
String implementationTitle,
|
|
String implementationVersion,
|
|
String implementationVendor,
|
|
URL sealBase)
|
|
{
|
|
Package p = new Package
|
|
(name, implementationTitle, implementationVersion,
|
|
implementationVendor, specificationTitle, specificationVersion,
|
|
specificationVendor, sealBase, this);
|
|
|
|
synchronized (this) {
|
|
packages().put(name, p);
|
|
return p;
|
|
}
|
|
}
|
|
|
|
public static ClassLoader getSystemClassLoader() {
|
|
return ClassLoader.class.getClassLoader();
|
|
}
|
|
|
|
protected Class defineClass(String name, byte[] b, int offset, int length) {
|
|
if (b == null) {
|
|
throw new NullPointerException();
|
|
}
|
|
|
|
if (offset < 0 || offset > length || offset + length > b.length) {
|
|
throw new IndexOutOfBoundsException();
|
|
}
|
|
|
|
return avian.SystemClassLoader.getClass
|
|
(avian.Classes.defineVMClass(this, b, offset, length));
|
|
}
|
|
|
|
protected Class defineClass(String name, byte[] b, int offset, int length,
|
|
ProtectionDomain domain)
|
|
{
|
|
return defineClass(name, b, offset, length);
|
|
}
|
|
|
|
protected Class findClass(String name) throws ClassNotFoundException {
|
|
throw new ClassNotFoundException();
|
|
}
|
|
|
|
protected Class reallyFindLoadedClass(String name) {
|
|
return null;
|
|
}
|
|
|
|
protected final Class findLoadedClass(String name) {
|
|
return reallyFindLoadedClass(name);
|
|
}
|
|
|
|
public Class loadClass(String name) throws ClassNotFoundException {
|
|
return loadClass(name, false);
|
|
}
|
|
|
|
protected Class loadClass(String name, boolean resolve)
|
|
throws ClassNotFoundException
|
|
{
|
|
Class c = findLoadedClass(name);
|
|
if (c == null) {
|
|
if (parent != null) {
|
|
try {
|
|
c = parent.loadClass(name);
|
|
} catch (ClassNotFoundException ok) { }
|
|
}
|
|
|
|
if (c == null) {
|
|
c = findClass(name);
|
|
}
|
|
}
|
|
|
|
if (resolve) {
|
|
resolveClass(c);
|
|
}
|
|
|
|
return c;
|
|
}
|
|
|
|
protected void resolveClass(Class c) {
|
|
avian.Classes.link(c.vmClass, this);
|
|
}
|
|
|
|
public final ClassLoader getParent() {
|
|
return parent;
|
|
}
|
|
|
|
protected URL findResource(String path) {
|
|
return null;
|
|
}
|
|
|
|
protected Enumeration<URL> findResources(String name) throws IOException {
|
|
return Collections.enumeration(new ArrayList<URL>(0));
|
|
}
|
|
|
|
public URL getResource(String path) {
|
|
URL url = null;
|
|
if (parent != null) {
|
|
url = parent.getResource(path);
|
|
}
|
|
|
|
if (url == null) {
|
|
url = findResource(path);
|
|
}
|
|
|
|
return url;
|
|
}
|
|
|
|
public InputStream getResourceAsStream(String path) {
|
|
URL url = getResource(path);
|
|
try {
|
|
return (url == null ? null : url.openStream());
|
|
} catch (IOException e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static URL getSystemResource(String path) {
|
|
return getSystemClassLoader().getResource(path);
|
|
}
|
|
|
|
public static InputStream getSystemResourceAsStream(String path) {
|
|
return getSystemClassLoader().getResourceAsStream(path);
|
|
}
|
|
|
|
public static Enumeration<URL> getSystemResources(String name) throws IOException {
|
|
return getSystemClassLoader().getResources(name);
|
|
}
|
|
|
|
public Enumeration<URL> getResources(String name)
|
|
throws IOException {
|
|
Collection<URL> resources = collectResources(name);
|
|
return Collections.enumeration(resources);
|
|
}
|
|
|
|
private Collection<URL> collectResources(String name) {
|
|
Collection<URL> urls = parent != null ? parent.collectResources(name) : new ArrayList<URL>(5);
|
|
URL url = findResource(name);
|
|
if (url != null) {
|
|
urls.add(url);
|
|
}
|
|
return urls;
|
|
}
|
|
|
|
protected String findLibrary(String name) {
|
|
return null;
|
|
}
|
|
|
|
static native Class getCaller();
|
|
|
|
static native void load(String name, Class caller, boolean mapName);
|
|
}
|