Test.class.getClassLoader();
получает ссылку на класс ClassLoader
из метода Class
'public ClassLoader getClassLoader()
- см. private final ClassLoader classLoader
ниже.
Поскольку вы обращаетесь к классу ClassLoader
из объекта этого класса, вы не получаете к нему статический доступ.
С Class.java
, Java SE 1.7 :
@CallerSensitive
public ClassLoader getClassLoader() {
ClassLoader cl = getClassLoader0();
if (cl == null)
return null;
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
ClassLoader.checkClassLoaderPermission(cl, Reflection.getCallerClass());
}
return cl;
}
// Package-private to allow ClassLoader access
ClassLoader getClassLoader0() { return classLoader; }
// Initialized in JVM not by private constructor
// This field is filtered from reflection access, i.e. getDeclaredField
// will throw NoSuchFieldException
private final ClassLoader classLoader;
Чтобы получить доступ к методу статическим способом, он должен быть вызван из класса, который объявляет его как статический, если вы хотите избавиться от предупреждения:
ClassLoader.getSystemResource("test.html").getFile()
Чтобы избежать NPE, файл test.html
должен находиться в вашей исходной папке.
Чтобы ответить на ваш комментарий, используйте метод, который возвращает отличное от URL
решение вашей проблемы - см. Чтение файла ресурса из jar .
public class Test {
public static void main(String[] args) {
StringBuilder contentBuilder = new StringBuilder();
InputStream is = Test.class.getResourceAsStream("/test.html");
try {
String sCurrentLine;
BufferedReader buffer = new BufferedReader(new InputStreamReader(is));
while ((sCurrentLine = buffer.readLine())!=null)
contentBuilder.append(sCurrentLine);
buffer.close();
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
System.out.println("content=" + contentBuilder.toString());
}
}