Вот код из createGE()
:
private static GraphicsEnvironment createGE() {
GraphicsEnvironment ge;
String nm = AccessController.doPrivileged(new GetPropertyAction("java.awt.graphicsenv", null));
try {
// long t0 = System.currentTimeMillis();
Class<GraphicsEnvironment> geCls;
try {
// First we try if the bootclassloader finds the requested
// class. This way we can avoid to run in a privileged block.
geCls = (Class<GraphicsEnvironment>)Class.forName(nm);
} catch (ClassNotFoundException ex) {
// If the bootclassloader fails, we try again with the
// application classloader.
ClassLoader cl = ClassLoader.getSystemClassLoader();
geCls = (Class<GraphicsEnvironment>)Class.forName(nm, true, cl);
}
ge = geCls.newInstance();
// long t1 = System.currentTimeMillis();
// System.out.println("GE creation took " + (t1-t0)+ "ms.");
if (isHeadless()) {
ge = new HeadlessGraphicsEnvironment(ge);
}
} catch (ClassNotFoundException e) {
throw new Error("Could not find class: "+nm);
} catch (InstantiationException e) {
throw new Error("Could not instantiate Graphics Environment: "
+ nm);
} catch (IllegalAccessException e) {
throw new Error ("Could not access Graphics Environment: "
+ nm);
}
return ge;
}
Хотя он никогда не напрямую вызывает new
создать объект , он делает это, используя рефлексию для создания GraphicsEnvironment для вас. В этом случае вызов newInstance()
создает новый экземпляр класса, который вы используете, если вы используете Headless; в этот момент он создается напрямую с помощью ключевого слова new
.
Это метод вызова. Что-то внутри этого метода знает, как получить или создать объект GraphicsEnvironment и вернуть его вам. Метод берет на себя ответственность за то, как делается объект; вы его не создаете. – khelwood
Вы не _creating_ объект; эта функция есть. – SLaks
, поэтому класс GraphicsEnvironment должен иметь модификатор «static», поскольку методы только статических классов можно вызвать, используя непосредственно имя класса. – trotsky