Чтение онлайн

на главную - закладки

Жанры

Программирование на Java

Вязовик Н.А.

Шрифт:

Еще один важный момент, связанный с этими методами, – они возвращают сам объект, у которого вызываются. Благодаря этому, возможно их использование в цепочке. Например:

public static void main(String[] args) {

StringBuffer sb = new StringBuffer("abc");

String str = sb.append("e").insert(4,

"f").insert(3,"d").toString;

System.out.println(str);

}

В результате на экран будет выведено:

abcdef

При передаче экземпляра класса StringBuffer в качестве параметра метода следует помнить, что этот класс изменяемый:

public class Test {

public static void main(String[] args) {

Test t = new Test;

StringBuffer sb = new StringBuffer("aaa");

System.out.println("Before = " + sb);

t.doTest(sb);

System.out.println("After = " + sb);

}

void doTest(StringBuffer theSb) {

theSb.append("-bbb");

}

}

В результате на экран будет выведено следующее:

Before = aaa

After = aaa-bbb

Поскольку все объекты передаются по ссылке, в методе doTest, при выполнении операций с theSB, будет модифицирован объект, на который ссылается sb.

Системные классы

Следующие классы, которые будут рассмотрены, обеспечивают взаимодействие с внутренними механизмами JVM и средой исполнения приложения:

* ClassLoader – загрузчик классов; отвечает за загрузку описания классов в память JVM;

* SecurityManager – менеджер безопасности; содержит различные методы проверки допустимости запрашиваемой операции;

* System – содержит набор полезных статических полей и методов;

* Runtime – позволяет приложению взаимодействовать со средой исполнения;

* Process – представляет интерфейс для взаимодействия с внешней программой, запущенной при помощи Runtime.

ClassLoader

Это абстрактный класс, ответственный за загрузку типов. По имени класса или интерфейса он находит и загружает в память данные, которые составляют определение типа. Обычно для этого используется простое правило: название типа преобразуется в название class -файла, из которого и считывается вся необходимая информация.

Каждый объект Class содержит ссылку на объект ClassLoader, с помощью которого он был загружен.

Для добавления альтернативного способа загрузки классов можно реализовать свой загрузчик, унаследовав его от ClassLoader. Например, описание класса может загружаться через сетевое соединение. Метод defineClass преобразует массив байт в экземпляр класса Class. С помощью метода newInstance могут быть получены экземпляры такого класса. В результате загруженный класс становится полноценной частью исполняемого Java-приложения.

Для иллюстрации приведем пример, как может выглядеть простая реализация загрузчика классов, использующего сетевое соединение:

class NetworkClassLoader extends ClassLoader {

String host; int port;

public NetworkClassLoader(String host, int port) {

this.host = host; this.port = port;

}

public Class findClass(String className) {

byte[] bytes = loadClassData(className);

return defineClass(className, bytes, 0,

bytes.length);

}

private byte[] loadClassData(

String className) {

byte[] result = null;

// open connection, load the class data

return result;

}

}

В этом примере только показано, что наследник загрузчика классов должен определить и реализовать методы findClass и loadClassData для загрузки описания класса. Когда описание получено, массив байт передается в метод defineClass для создания экземпляра Class. Для простоты в примере приведен только шаблонный код, без реализации получения байт из сетевого соединения.

Для получения экземпляров классов, загруженных с помощью этого загрузчика, можно воспользоваться методом loadClass:

try {

ClassLoader loader =

new NetworkClassLoader(host, port);

Object main = loader.loadClass(

"Main").newInstance;

}

catch(ClassNotFoundException e) {

e.printStackTrace;

}

catch(InstantiationException e) {

e.printStackTrace;

}

catch(IllegalAccessException e) {

e.printStackTrace;

}

Если такой класс не будет найден, будет брошено исключение ClassNotFoundException, если класс будет найден, но произойдет какая-либо ошибка при создании объекта этого класса – будет брошено исключение InstantiationException, и, наконец, если у вызывающего потока не имеется соответствующих прав для создания экземпляров этого класса (что проверяется менеджером безопасности), будет брошено исключение IllegalAccessException.

SecurityManager – менеджер безопасности

С помощью методов этого класса приложения перед выполнением потенциально опасных операций проверяют, является ли операция допустимой в данном контексте.

Класс SecurityManager содержит много методов с именами, начинающимися с приставки check ("проверить"). Эти методы вызываются из стандартных классов библиотек Java перед тем, как в них будут выполнены потенциально опасные операции. Типичный вызов выглядит примерно следующим образом:

SecurityManager security =

System.getSecurityManager;

Поделиться:
Популярные книги

Газлайтер. Том 31

Володин Григорий Григорьевич
31. История Телепата
Фантастика:
боевая фантастика
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Газлайтер. Том 31

Кодекс Охотника. Книга XXXV

Винокуров Юрий
35. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXV

Мужчина моей судьбы

Ардова Алиса
2. Мужчина не моей мечты
Любовные романы:
любовно-фантастические романы
8.03
рейтинг книги
Мужчина моей судьбы

Он тебя не любит(?)

Тоцка Тала
Любовные романы:
современные любовные романы
7.46
рейтинг книги
Он тебя не любит(?)

Дорогами алхимии

Видум Инди
2. Под знаком Песца
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Дорогами алхимии

Сильнейший Столп Империи. Книга 5

Ермоленков Алексей
5. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 5

Камень. Книга 4

Минин Станислав
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Камень. Книга 4

Рождественский детектив (сборник рассказов)

Полякова Татьяна Викторовна
Детективы:
прочие детективы
6.00
рейтинг книги
Рождественский детектив (сборник рассказов)

Черный рынок

Вайс Александр
6. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Черный рынок

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Идеальный мир для Лекаря

Сапфир Олег
1. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря

Меткий стрелок. Том II

Вязовский Алексей
2. Меткий стрелок
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Меткий стрелок. Том II

Врубель

Коган Дора Зиновьевна
Жизнь в искусстве
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Врубель

Студент из прошлого тысячелетия

Еслер Андрей
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Студент из прошлого тысячелетия