146 java jar class classloader
我现在不在IDE的前面,只是查看API规范.
CodeSource src = MyClass.class.getProtectionDomain().getCodeSource();
if (src != null) {
URL jar = src.getLocation();
}
Run Code Online (Sandbox Code Playgroud)
我想确定一个类来自哪个JAR文件.这是这样做的吗?
Cha*_*tni 182
是.它适用于除bootstrap类加载器加载的类之外的所有类.另一种确定方法是:
Class klass = String.class;
URL location = klass.getResource('/' + klass.getName().replace('.', '/') + ".class");
Run Code Online (Sandbox Code Playgroud)
由于notnoop指出klass.getResource()
方法返回类文件本身的位置.例如:
jar:file:/jdk/jre/lib/rt.jar!/java/lang/String.class
file:/projects/classes/pkg/MyClass$1.class
Run Code Online (Sandbox Code Playgroud)
该getProtectionDomain().getCodeSource().getLocation()
方法返回jar文件或CLASSPATH的位置
file:/Users/home/java/libs/ejb3-persistence-1.0.2.GA.jar
file:/projects/classes
Run Code Online (Sandbox Code Playgroud)
not*_*oop 12
LiveInjector.findPathJar()
从Lombok PatcherLiveInjector.java
结账.请注意,特殊情况下文件实际上并不存在于jar中,您可能希望更改它.
/**
* If the provided class has been loaded from a jar file that is on the local file system, will find the absolute path to that jar file.
*
* @param context The jar file that contained the class file that represents this class will be found. Specify {@code null} to let {@code LiveInjector}
* find its own jar.
* @throws IllegalStateException If the specified class was loaded from a directory or in some other way (such as via HTTP, from a database, or some
* other custom classloading device).
*/
public static String findPathJar(Class<?> context) throws IllegalStateException {
if (context == null) context = LiveInjector.class;
String rawName = context.getName();
String classFileName;
/* rawName is something like package.name.ContainingClass$ClassName. We need to turn this into ContainingClass$ClassName.class. */ {
int idx = rawName.lastIndexOf('.');
classFileName = (idx == -1 ? rawName : rawName.substring(idx+1)) + ".class";
}
String uri = context.getResource(classFileName).toString();
if (uri.startsWith("file:")) throw new IllegalStateException("This class has been loaded from a directory and not from a jar file.");
if (!uri.startsWith("jar:file:")) {
int idx = uri.indexOf(':');
String protocol = idx == -1 ? "(unknown)" : uri.substring(0, idx);
throw new IllegalStateException("This class has been loaded remotely via the " + protocol +
" protocol. Only loading from a jar on the local file system is supported.");
}
int idx = uri.indexOf('!');
//As far as I know, the if statement below can't ever trigger, so it's more of a sanity check thing.
if (idx == -1) throw new IllegalStateException("You appear to have loaded this class from a local jar file, but I can't make sense of the URL!");
try {
String fileName = URLDecoder.decode(uri.substring("jar:file:".length(), idx), Charset.defaultCharset().name());
return new File(fileName).getAbsolutePath();
} catch (UnsupportedEncodingException e) {
throw new InternalError("default charset doesn't exist. Your VM is borked.");
}
}
Run Code Online (Sandbox Code Playgroud)
Abh*_*jee 10
使用
String path = <Any of your class within the jar>.class.getProtectionDomain().getCodeSource().getLocation().getPath();
Run Code Online (Sandbox Code Playgroud)
如果其中包含多个条目,则执行一些子字符串操作。