Open-source multiplayer game server compatible with the RuneScape client https://www.openrs2.org/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
openrs2/deob/src/main/java/dev/openrs2/deob/classpath/ClassPath.java

61 lines
1.4 KiB

package dev.openrs2.deob.classpath;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import dev.openrs2.asm.Library;
public final class ClassPath {
private final ClassLoader dependencyLoader;
private final List<Library> libraries;
private final Map<String, ClassMetadata> cache = new HashMap<>();
public ClassPath(ClassLoader dependencyLoader, Library... libraries) {
this.dependencyLoader = dependencyLoader;
this.libraries = List.of(libraries);
}
public List<ClassMetadata> getLibraryClasses() {
var classes = new ArrayList<ClassMetadata>();
for (var library : libraries) {
for (var clazz : library) {
classes.add(get(clazz.name));
}
}
return Collections.unmodifiableList(classes);
}
public ClassMetadata get(String name) {
var metadata = cache.get(name);
if (metadata != null) {
return metadata;
}
for (var library : libraries) {
var clazz = library.get(name);
if (clazz != null) {
metadata = new AsmClassMetadata(this, clazz);
cache.put(name, metadata);
return metadata;
}
}
var reflectionName = name.replace('/', '.');
Class<?> clazz;
try {
clazz = dependencyLoader.loadClass(reflectionName);
} catch (ClassNotFoundException ex) {
throw new IllegalArgumentException("Unknown class " + name);
}
metadata = new ReflectionClassMetadata(this, clazz);
cache.put(name, metadata);
return metadata;
}
}