Презентация Класс Modifier в Java. (Лекция 8) онлайн
На нашем сайте вы можете скачать и просмотреть онлайн доклад-презентацию на тему Класс Modifier в Java. (Лекция 8) абсолютно бесплатно. Урок-презентация на эту тему содержит всего 47 слайдов. Все материалы созданы в программе PowerPoint и имеют формат ppt или же pptx. Материалы и темы для презентаций взяты из открытых источников и загружены их авторами, за качество и достоверность информации в них администрация сайта не отвечает, все права принадлежат их создателям. Если вы нашли то, что искали, отблагодарите авторов - поделитесь ссылкой в социальных сетях, а наш сайт добавьте в закладки.
Презентации » Устройства и комплектующие » Класс Modifier в Java. (Лекция 8)
Оцените!
Оцените презентацию от 1 до 5 баллов!
- Тип файла:ppt / pptx (powerpoint)
- Всего слайдов:47 слайдов
- Для класса:1,2,3,4,5,6,7,8,9,10,11
- Размер файла:191.00 kB
- Просмотров:72
- Скачиваний:0
- Автор:неизвестен
Слайды и текст к этой презентации:
№2 слайд
![Класс Modifier Класс Modifier](/documents_6/4fd412db7afc6007dba01ec86a38515b/img1.jpg)
Содержание слайда: Класс Modifier
Класс Modifier
Класс Modifier кодирует все модификаторы, используемые в объявлениях типа, в виде констант:
ABSTRACT, FINAL, INTERFACE, NATIVE, PRIVATE, PROTECTED, PUBLIC, STATIC, STRICT, SYBCHRONIZED, TRANSIDENT, VOLATILE.
Каждой из констант отвечает метод запрос вида isMod(int modifier) (тут Mod одно из выше приведенных имен, например, isPublic), который возвращает true, если модификатор mod присутствует в объявлении типа.
№3 слайд
![Рассмотрим пример. Пусть](/documents_6/4fd412db7afc6007dba01ec86a38515b/img2.jpg)
Содержание слайда: Рассмотрим пример. Пусть имеется объявление поля
Рассмотрим пример. Пусть имеется объявление поля
public static final int s=10;
тогда значение возвращаемое методом getModifiers соответствующего объекта класса Field будет иметь вид
Modifier.PUBLIC | Modifier.STATIC |
Modifier.FINAL
Модификатор strictfp представляется константой STRICT.
Методы- запросы можно использовать в следующей форме
№4 слайд
![Modifier.isPrivate](/documents_6/4fd412db7afc6007dba01ec86a38515b/img3.jpg)
Содержание слайда: Modifier.isPrivate(field.getModifiers());
Modifier.isPrivate(field.getModifiers());
это эквивалентно следующему условию
(field.getModifiers()&Modifier.PRIVATE)!=0
Класс Field
В составе класса Field реализованы методы, позволяющие запрашивать информацию о типе поля, а также считывать и задавать его значение.
Рассмотрим некоторые методы класса Field
1. getType() – возвращает объект класса Class, отвечающий типу текущего поля. Например, для поля типа int, получим int.class.
№5 слайд
![. Методы set и get позволяют](/documents_6/4fd412db7afc6007dba01ec86a38515b/img4.jpg)
Содержание слайда: 2. Методы set и get – позволяют считывать текущее значение поля, а также задавать новое. Рассмотрим пример:
2. Методы set и get – позволяют считывать текущее значение поля, а также задавать новое. Рассмотрим пример:
public static void printField(Object o,
String name) throws
NoSuchFieldException,
IllegalAccessException{
Field field = o.getClass().getField(name);
Short value = (Short) field.get(o); System.out.println(value);
}
Т.е. метод get возвращает значение, на которое ссылается соответствующее поле или объект класса –оболочки.
Пример использования метода set имеет вид:
№6 слайд
![public static void setField](/documents_6/4fd412db7afc6007dba01ec86a38515b/img5.jpg)
Содержание слайда: public static void setField(Object o, String name,
public static void setField(Object o, String name,
short nv) throws
NoSuchFieldException,
IllegalAccessException{
Field field = o.getClass().getField(name) ;
field.set(o,new Short(nv));
}
Для сохранения nv в поле данного объекта необходимо использовать классы оболочки.
Существуют также методы имеющие вид getPrimitiveType (например, getInt) и setPrimitiveType. Эти методы можно использовать для изменения полей в классе, имеющих примитивный тип. Например,
field.setShort(o,nv);
№7 слайд
![Класс Method Класс Method](/documents_6/4fd412db7afc6007dba01ec86a38515b/img6.jpg)
Содержание слайда: Класс Method
Класс Method
Средства класса Method - позволяют получать полную информацию, касающуюся объявлений методов определенного класса, и при необходимости вызывать эти методы в контексте заданных объектов.
Рассмотрим методы класса Method.
1. public Class getReturnType() - возвращает объект Class, соответствующий типу значения, возвращаемого текущим методом. Если вместо типа возвращаемого значения в объявлении метода указано служебное слово void, рассматриваемый метод вернет объект void.class.
№8 слайд
![. public Class](/documents_6/4fd412db7afc6007dba01ec86a38515b/img7.jpg)
Содержание слайда: 2. public Class[] getParameterTypes() - возвращает массив объектов Class, соответствующих типам параметров, которые заданы в объявлении текущего метода. Объекты заносятся в массив в том порядке, в каком параметры перечислены в объявлении метода. Если метод не имеет параметров, возвращается пустой массив.
2. public Class[] getParameterTypes() - возвращает массив объектов Class, соответствующих типам параметров, которые заданы в объявлении текущего метода. Объекты заносятся в массив в том порядке, в каком параметры перечислены в объявлении метода. Если метод не имеет параметров, возвращается пустой массив.
3. public Class[] getExceptionTypes() - возвращает массив объектов Class, соответствующих типам исключений, которые заданы в предложении throws объявления текущего метода. Объекты заносятся в массив в том порядке, в каком наименования типов исключений перечислены в объявлении метода.
№9 слайд
![. public Object invoke Object](/documents_6/4fd412db7afc6007dba01ec86a38515b/img8.jpg)
Содержание слайда: 4. public Object invoke(Object onThis, Object[] args)
4. public Object invoke(Object onThis, Object[] args)
throws IllegalAccessException,
IllegalArgumentException,
InvocationTargetException
Вызывает метод, определяемый текущим объектом Method, в контексте объекта onThis с заданием значений аргументов, передаваемых массивом args.
Для нестатических методов выбор реализации осуществляется на основании фактического типа объекта, определяемого параметром onThis. Для статических методов onThis не принимается во внимание и может быть равен null.
Длина массива args должна совпадать с числом параметров в объявлении метода, а типы объектов-элементов массива должны допускать присваивание соответствующим типам параметров метода — в противном случае будет выброшено исключение IIlegalArgumentException.
№10 слайд
![Если в составе объекта,](/documents_6/4fd412db7afc6007dba01ec86a38515b/img9.jpg)
Содержание слайда: Если в составе объекта, определяемого параметром onThis, нет типа, членом которого является текущий метод, выбрасывается исключение IllegalArgumentException.
Если в составе объекта, определяемого параметром onThis, нет типа, членом которого является текущий метод, выбрасывается исключение IllegalArgumentException.
Если значение onThis равно null и метод не статический, генерируется исключение типа NullPointerException.
Если выполнение вызываемого метода завершается аварийно, выбрасывается исключение типа InvocationTargetException.
№11 слайд
![Рассмотрим пример. Вызовем](/documents_6/4fd412db7afc6007dba01ec86a38515b/img10.jpg)
Содержание слайда: Рассмотрим пример. Вызовем средствами рефлексии метод return str.indexOf(".", 8)
Рассмотрим пример. Вызовем средствами рефлексии метод return str.indexOf(".", 8)
тогда имеем
try {
Сlass strClass = str.getClass();
Method indexM = strClass.getMethod("indexOf",
new Class[] { string.class, int.class } );
Object result = indexM.invoke(str, new object[] {
".", new lnteger(8)} );
return ((Integer) result).intValue();
}
catch (NoSuchMethodException e) { …….. }
catch (invocationTargetException e) {…….. }
catch (illegalAccessException e) {……}
№12 слайд
![Класс Constructor Класс](/documents_6/4fd412db7afc6007dba01ec86a38515b/img11.jpg)
Содержание слайда: Класс Constructor
Класс Constructor
Для создания новых экземпляров (объектов) типа может быть использован метод newlnstance объекта Class, соответствующего этому типу.
Метод вызывает конструктор без аргументов, принадлежащий типу, и возвращает ссылку на вновь созданный объект класса Object, который должен быть явно преобразован к требуемому типу.
Рассмотрим пример.
№13 слайд
![static double testData . , .](/documents_6/4fd412db7afc6007dba01ec86a38515b/img12.jpg)
Содержание слайда: static double[] testData = { 0.3,1.3e-2, 7.9, 3.17 };
static double[] testData = { 0.3,1.3e-2, 7.9, 3.17 };
public static void main(String[] args){
try {
for(int arg = 0; arg < args.length; arg++){
String name = args[arg];
Class classFor = Class.forName(name);
SortDouble sorter =
(SortDouble)classFor.newInstance();
SortMetrics metrics = sorter.sort(testData);
System.out.println(name + ": " + metrics);
for(int i =0; i < testData.length; i++)
System.out.println(“ " + testData[i]); } }
catch(Exception e) { System.err.println(e); } }
№14 слайд
![Метод newlnstance при](/documents_6/4fd412db7afc6007dba01ec86a38515b/img13.jpg)
Содержание слайда: Метод newlnstance при некорректном применении способен выбрасывать большое число объектов исключений различных типов.
Метод newlnstance при некорректном применении способен выбрасывать большое число объектов исключений различных типов.
InstantiationException-если класс, объект которого должен быть создан, не обладает конструктором без аргументов, либо определен как абстрактный, либо в действительности является интерфейсом, либо выполнение процедуры создания объекта прерывается по каким-либо иным причинам.
IllegalAccessException - если класс либо его конструктор без аргументов недоступны.
№15 слайд
![SecurityException - если](/documents_6/4fd412db7afc6007dba01ec86a38515b/img14.jpg)
Содержание слайда: SecurityException - если действующая политика безопасности запрещает создание новых объектов
SecurityException - если действующая политика безопасности запрещает создание новых объектов
ExceptionInInitializerError –выбрасывается при инициализации класса.
В классе Constructor определены и другие методы.
public Сlass[] getParameterTypes()
Возвращает массив объектов Class, соответствующих типам параметров, которые заданы в объявлении текущего конструктора.
public Class[] getExceptionTypes()
Возвращает массив объектов Class, соответствующих типам исключений, которые заданы в предложении throws объявления текущего конструктора.
№16 слайд
![public Object newlnstance](/documents_6/4fd412db7afc6007dba01ec86a38515b/img15.jpg)
Содержание слайда: public Object newlnstance(Object[] args)
public Object newlnstance(Object[] args)
throws InstantiationException,
IllegalAccessException,
IllegalArgumentException,
InvocationTargetException
Использует конструктор, представляемый текущим объектом Constructor, для создания и инициализации нового экземпляра класса, в котором конструктор объявлен, с передачей заданных аргументов.
Возвращает ссылку на вновь созданный и инициализированный объект. Длина массива args должна совпадать с числом параметров в объявлении конструктора, а типы объектов-элементов массива должны допускать присваивание соответствующим типам параметров конструктора — в противном случае будет выброшено исключение IllegalArgumentException.
№17 слайд
![Рассмотрим пример Рассмотрим](/documents_6/4fd412db7afc6007dba01ec86a38515b/img16.jpg)
Содержание слайда: Рассмотрим пример:
Рассмотрим пример:
class Myclass {
private int a;
public Myclass(int k){a=k;}
public int func(int a,int b){return a+b;}
}
public class Main{
public static void main(String[] args){
try{
String name="Myclass";
Class mycl=Class.forName(name);
Class[] d={int.class};
Constructor c=mycl.getConstructor(d);
Myclass ob=(Myclass)c.newInstance(new Object[]{
new Integer(10)});
System.out.println(ob.func(3,5)); }
catch(Exception e){};
}}
№18 слайд
![Класс AccessibleObject Класс](/documents_6/4fd412db7afc6007dba01ec86a38515b/img17.jpg)
Содержание слайда: Класс AccessibleObject
Класс AccessibleObject
Классы Field, Constructor и Method являются производными от класса AccessibleObject, который дает возможность разрешать или запрещать проверку признаков доступа уровня языка, таких как public и private.
Класс AccessibleObject имеет методы
public void setAccessible(boolean flag)
Устанавливает флаг доступа к объекту в соответствии со значением аргумента: true означает, что объект больше не подчиняется правилам доступа, устанавливаемым на уровне языка (и будет всегда доступен), a false вынуждает объект поддерживать заданный уровень доступа.
Если полномочий по изменению флага доступа недостаточно, выбрасывается исключение типа SecurityException
№19 слайд
![. public static . public](/documents_6/4fd412db7afc6007dba01ec86a38515b/img18.jpg)
Содержание слайда: 2. public static
2. public static
void setAccessible(AccessibleObject[] array,
boolean flag)
Позволяет установить флаг доступа к объектам, передаваемым в виде массива.
Если в процессе обработки очередного объекта выбрасывается исключение типа SecurityException, объекты, расположенные в массиве ранее, сохраняют вновь заданные значения уровня доступа, а все остальные объекты остаются в прежнем состоянии.
3. public boolean isAccessible()
Возвращает текущее значение флага доступа к объекту
№20 слайд
![Класс Array Класс Array Класс](/documents_6/4fd412db7afc6007dba01ec86a38515b/img19.jpg)
Содержание слайда: Класс Array
Класс Array
Класс Array используется для создания массива средствами рефлексии.
Для создания массивов используются две формы метода newInstance.
public Object newlnstance(Class compType, int length)
Возвращает ссылку на новый массив типа compType заданной длины length.
public Object newInstance(Class compType, int[] dim)
Возвращает ссылку на новый многомерный массив типа compType, размерности которого заданы значениями элементов массива-параметра dim.
Если массив dim пуст или обладает длиной, превышающей допустимое число размерностей (обычно 255), выбрасывается исключение типа llegalArgumentException.
№21 слайд
![Рассмотрим примеры.](/documents_6/4fd412db7afc6007dba01ec86a38515b/img20.jpg)
Содержание слайда: Рассмотрим примеры.
Рассмотрим примеры.
Пример1. Сформируем массив типа byte
byte[] ba = (byte[])
Array.newlnstance(byte.class,13);
Это равнозначно
byte[] ba = new byte[13];
Пример2.
int[] dims = {4, 4};
double[][] matrix =(double[][])
Array.newlnstance(double.class, dims);
Это равнозначно
double[][] matrix = new double[4][4];
№22 слайд
![Класс Array обладает методами](/documents_6/4fd412db7afc6007dba01ec86a38515b/img21.jpg)
Содержание слайда: Класс Array обладает методами get и set.
Класс Array обладает методами get и set.
Пусть задан массив ха значений типа int; тогда выражению xa[i] будет соответствовать:
Integer n=Array.get(xa, i)
Присвоить значение элементу массива можно так: xa[i] = 23; - это то же самое, что
Array.set(xa, i, new Integer(23));
Класс Package
Вызов метода getPackage класса Class позволяет получить объект класса Package, содержащий описание пакета, в составе которого определен класс (сам класс Package размещен в пакете java.lang).
Метод getName() объекта Package возвращает полное имя текущего пакета.
№23 слайд
![Класс Proxy Класс Proxy Класс](/documents_6/4fd412db7afc6007dba01ec86a38515b/img22.jpg)
Содержание слайда: Класс Proxy
Класс Proxy
Класс Proxy позволяет динамически создавать классы, реализующие один или несколько интерфейсов.
Предположим, что имеется класс A, реализующий некоторые интерфейсы.
Java-машина во время исполнения может сгенерировать прокси-класс для данного класса A, т.е. такой класс, который реализует все интерфейсы класса A, но заменяет вызов всех методов этих интерфейсов на вызов метода invoke, интерфейса InvocationHandler,для которого можно определять свои реализации.
№24 слайд
![Создается прокси-класс с](/documents_6/4fd412db7afc6007dba01ec86a38515b/img23.jpg)
Содержание слайда: Создается прокси-класс с помощью вызова метода Proxy.getProxyClass, который принимает ClassLoader и массив интерфейсов (interfaces), а возвращает объект класса java.lang.Class, который загружен с помощью переданного ClassLoader и реализует переданный массив интерфейсов.
Создается прокси-класс с помощью вызова метода Proxy.getProxyClass, который принимает ClassLoader и массив интерфейсов (interfaces), а возвращает объект класса java.lang.Class, который загружен с помощью переданного ClassLoader и реализует переданный массив интерфейсов.
На передаваемые параметры есть ряд ограничений:
1. Все объекты в массиве interfaces должны быть интерфейсами. Они не могут быть классами или примитивами.
2. В массиве interfaces не может быть двух одинаковых объектов.
3. Все интерфейсы в массиве interfaces должны быть загружены тем ClassLoader, который передается в метод getProxyClass.
4. Все не публичные интерфейсы должны быть определены в одном и том же пакете, иначе генерируемый прокси-класс не сможет их все реализовать.
№25 слайд
![. Ни в каких двух интерфейсах](/documents_6/4fd412db7afc6007dba01ec86a38515b/img24.jpg)
Содержание слайда: 5. Ни в каких двух интерфейсах не может быть метода с одинаковым названием и сигнатурой параметров, но с разными типами возвращаемого значения.
6. Длина массива interfaces ограничена 65535-ю интерфейсами. Никакой Java-класс не может реализовывать более 65535 интерфейсов.
5. Ни в каких двух интерфейсах не может быть метода с одинаковым названием и сигнатурой параметров, но с разными типами возвращаемого значения.
6. Длина массива interfaces ограничена 65535-ю интерфейсами. Никакой Java-класс не может реализовывать более 65535 интерфейсов.
№26 слайд
![Свойства динамического](/documents_6/4fd412db7afc6007dba01ec86a38515b/img25.jpg)
Содержание слайда: Свойства динамического прокси-класса
Свойства динамического прокси-класса
1. Прокси-класс является публичным, снабжен модификатором final и не является абстрактным.
2. Имя прокси-класса по-умолчанию не определено, однако начинается на Proxy. Все пространство имен, начинающихся на Proxy зарезервировано для прокси-классов
(В последних версиях Java это не обязательно).
3. Прокси-класс наследуется от
java.lang.reflect.Proxy.
4. Прокси-класс реализует все интерфейсы, переданные при создании, в порядке передачи.
№27 слайд
![. Если прокси-класс реализует](/documents_6/4fd412db7afc6007dba01ec86a38515b/img26.jpg)
Содержание слайда: 5. Если прокси-класс реализует непубличный интерфейс, то он будет сгенерирован в том пакете, в котором определен этот самый непубличный интерфейс. В общем случае пакет, в котором будет сгенерирован прокси-класс неопределен.
5. Если прокси-класс реализует непубличный интерфейс, то он будет сгенерирован в том пакете, в котором определен этот самый непубличный интерфейс. В общем случае пакет, в котором будет сгенерирован прокси-класс неопределен.
6. Метод Proxy.isProxyClass возвращает true для классов, созданных с помощью Proxy.getProxyClass и для классов объектов, созданных с помощью Proxy.newProxyInstance и false в противном случае.
Данный метод используется подсистемой безопасности Java и нужно понимать, что для класса, просто унаследованного от java.lang.reflect.Proxy он вернет false.
№28 слайд
![Свойства созданного](/documents_6/4fd412db7afc6007dba01ec86a38515b/img27.jpg)
Содержание слайда: Свойства созданного экземпляра прокси-класса следующие:
Свойства созданного экземпляра прокси-класса следующие:
1. Объект прокси-класса приводим ко всем интерфейсам, переданным в массиве interfaces. Если IDemo - один из переданных интерфейсов, то операция proxy instanceof IDemo всегда вернет true, а операция (IDemo) proxy завершится корректно.
2. Статический метод Proxy.getInvocationHandler возвращает обработчик вызовов, переданный при создании экземпляра прокси-класса. Если переданный в данный метод объект не является экземпляром прокси-класса, то будет выброшено IllegalArgumentException исключение.
3. Класс-обработчик вызовов реализует интерфейс InvocationHandler, в котором определен метод invoke, имеющий следующую сигнатуру:
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable
№29 слайд
![Рассмотрим пример Рассмотрим](/documents_6/4fd412db7afc6007dba01ec86a38515b/img28.jpg)
Содержание слайда: Рассмотрим пример:
Рассмотрим пример:
package javaapplication3;
interface Account {
double getBalance();
void changeBalance(int sum);
void percents(double per);}
class MyAccount implements Account{
private double balance;
public MyAccount(){ balance=0.0; }
public double getBalance(){ return balance; }
public void changeBalance(int sum){
balance+=sum;}
public void percents(double per){
balance+=balance*per/100; }; }
№30 слайд
![class MyAccountProxy](/documents_6/4fd412db7afc6007dba01ec86a38515b/img29.jpg)
Содержание слайда: class MyAccountProxy implements
class MyAccountProxy implements
InvocationHandler{
private Account ac;
public MyAccountProxy(Account acc){ ac=acc; }
public static Account newInstance(Account da){
return (Account)Proxy.newProxyInstance(
da.getClass().getClassLoader(),
da.getClass().getInterfaces(),
new MyAccountProxy(da));
}
№31 слайд
![public Object invoke Object](/documents_6/4fd412db7afc6007dba01ec86a38515b/img30.jpg)
Содержание слайда: public Object invoke(Object proxy,
public Object invoke(Object proxy,
Method method, Object[] args)
throws Throwable{
if(method.getName()=="percents"){
double d=((Double)args[0]).doubleValue();
if (d<0) d=0;
if(d>30) d=30;
args[0]=new Double(d);
return method.invoke(ac, args); }
else{
return method.invoke(ac, args); }
}
}
№32 слайд
![public class Main public](/documents_6/4fd412db7afc6007dba01ec86a38515b/img31.jpg)
Содержание слайда: public class Main{
public class Main{
public static void main(String[] args){
MyAccount ma=new MyAccount();
Account
a=(Account)MyAccountProxy.newInstance(ma);
a.changeBalance(150);
System.out.println(a.getBalance());
a.percents(20);
System.out.println(a.getBalance());
a.percents(35);
System.out.println(a.getBalance());} }
№33 слайд
![Загрузка классов Загрузка](/documents_6/4fd412db7afc6007dba01ec86a38515b/img32.jpg)
Содержание слайда: Загрузка классов
Загрузка классов
Исполняющая система загружает классы по мере возникновения необходимости в них. Функциональные особенности процедур загрузки классов существенным образом зависят от реализации виртуальных машин Java, но в большинстве случаев для отыскания классов, адресуемых приложением, но не загруженных исполняющей системой, применяется механизм просмотра пути поиска классов.
Чтобы создать приложение, которое в состоянии загружать классы способами, отличными от предусмотренных по умолчанию, следует воспользоваться объектом класса ClassLoader, способным получить байт-код реализации нужного класса и загрузить его в среду исполняющей системы.
№34 слайд
![Класс ClassLoader является](/documents_6/4fd412db7afc6007dba01ec86a38515b/img33.jpg)
Содержание слайда: Класс ClassLoader является абстрактным классом. Для создания собственного загрузчика классов, необходимо создать класс – наследник от ClassLoader и переопределить метод
Класс ClassLoader является абстрактным классом. Для создания собственного загрузчика классов, необходимо создать класс – наследник от ClassLoader и переопределить метод
protected Class findClass(String name) throws
ClassNotFoundException
Который находит байт-код класса с заданным именем name и загружает данные в среду виртуальной машины, возвращая объект Class, представляющий найденный класс.
Объект-загрузчик способен делегировать полномочия по загрузке классов "родительскому" загрузчику классов (parent class loader). "Родительский" загрузчик классов может быть задан в качестве аргумента конструктора класса ClassLoader.
№35 слайд
![protected ClassLoader](/documents_6/4fd412db7afc6007dba01ec86a38515b/img34.jpg)
Содержание слайда: protected ClassLoader()
protected ClassLoader()
Создает объект ClassLoader, неявно используя в качестве "родительского" загрузчика классов системный загрузчик (который может быть получен посредством вызова метода getSystemClassLoader).
protected ClassLoader(ClassLoader parent)
Создает объект ClassLoader, используя заданный "родительский" загрузчик классов.
Основным в составе класса ClassLoader является метод loadClass
№36 слайд
![public Сlass loadClass String](/documents_6/4fd412db7afc6007dba01ec86a38515b/img35.jpg)
Содержание слайда: public Сlass loadClass(String name) throws
public Сlass loadClass(String name) throws
ClassNotFoundException
возвращает объект Class для класса с заданным именем и при необходимости загружает этот класс. Если класс не может быть загружен, выбрасывается исключение типа ClassNotFoundException.
Схема загрузки классов, предлагаемая методом loadClass по умолчанию и обычно не переопределяемая, выглядит так:
проверить посредством вызова метода
findLoadedClass класса ClassLoader, не загружался ли заданный класс раньше; в составе ClassLoader предусмотрена таблица объектов Class для всех классов, загруженных средствами текущего загрузчика классов; если класс был загружен прежде, метод findLoadedClass возвратит ссылку на существующий объект Class;
№37 слайд
![. если класс не загружался,](/documents_6/4fd412db7afc6007dba01ec86a38515b/img36.jpg)
Содержание слайда: 2. если класс не загружался, вызывается loadClass "родительского" загрузчика классов; если текущий загрузчик не обладает "родителем", используется системный загрузчик классов;
2. если класс не загружался, вызывается loadClass "родительского" загрузчика классов; если текущий загрузчик не обладает "родителем", используется системный загрузчик классов;
3. если класс все еще не загружен, вызывается метод findClass, выполняющий поиск и загрузку класса.
Таким образом, необходимо реализовать собственные версии следующих методов ClassLoader:
№38 слайд
![protected synchronized Class](/documents_6/4fd412db7afc6007dba01ec86a38515b/img37.jpg)
Содержание слайда: protected synchronized Class
protected synchronized Class
loadClass(String name,boolean resolve)
throws ClassNotFoundException
protected Class findClass(String name)
throws ClassNotFoundException
protected java.net.URL findResource(String name)
protected java.util.Enumeration
findResources(String name) throws IOException
( Абстрактный класс ClassLoader представляет только реализацию метода loadClass, основанную на protected-методах – findLoadedClass и findClass).
№39 слайд
![Рассмотрим пример. Рассмотрим](/documents_6/4fd412db7afc6007dba01ec86a38515b/img38.jpg)
Содержание слайда: Рассмотрим пример.
Рассмотрим пример.
class PlayerLoader extends ClassLoader {
public Class findClass(String name) throws
ClassNotFoundException {
try {
byte[] buf = bytesForClass(name);
return defineClass(name, buf, 0, buf.length);
}
catch (IOException e) {
throw new ClassNotFoundException(e.toString());
}
}
// ... Объявления метода bytesForClass и других
методов
}
№40 слайд
![Метод findClass обычно](/documents_6/4fd412db7afc6007dba01ec86a38515b/img39.jpg)
Содержание слайда: Метод findClass обычно выполняет две функции.
Метод findClass обычно выполняет две функции.
Во-первых, он должен обнаружить байт-код заданного класса и сохранить его в массиве типа byte — эта обязанность в примере возложена на метод bytesForСlass.
Во-вторых, он использует прикладной метод defineСlass, чтобы выполнить фактическую загрузку класса, определяемого байт-кодом.
Метод defineСlass имеет вид
№41 слайд
![protected final Class](/documents_6/4fd412db7afc6007dba01ec86a38515b/img40.jpg)
Содержание слайда: protected final Class defineClass(String name,
protected final Class defineClass(String name,
byte[] data, int offset, int length) throws
ClassFormatError
Возвращает объект Class для класса с заданным именем name; бинарное представление класса передается в виде массива data.
Для загрузки класса используются только байты, содержащиеся в элементах массива data с индексами от offset до offset+length. Если байты из указанного промежутка не удовлетворяют требуемому формату описания класса, выбрасывается объект исключения типа ClassFormatError.
Метод ответствен за сохранение ссылки на объект Class для загруженного класса в таблице загруженных классов, просматриваемой методом findLoadedClass.
№42 слайд
![Рассмотрим метод](/documents_6/4fd412db7afc6007dba01ec86a38515b/img41.jpg)
Содержание слайда: Рассмотрим метод bytesForClass.
Рассмотрим метод bytesForClass.
protected byte[] bytesForClass(String name) throws
lOException, ClassNotFoundException{
FileInputStream in = null;
try {
in = new FileInputStream(name + ".class");
int length = in.available(); // число доступных байтов
if (length == 0) throw new ClassNotFoundException(name);
byte[ ] buf = new byte[length];
in.read(buf); // Считывание байтов
return buf;
}
finally {
if (in!=null) in.close();
}
}
№43 слайд
![Таким образом полный код](/documents_6/4fd412db7afc6007dba01ec86a38515b/img42.jpg)
Содержание слайда: Таким образом полный код имеет вид:
Таким образом полный код имеет вид:
import java.lang.reflect.*;
import java.io.*;
class MyClassLoader extends ClassLoader{
public Class<?> findClass(String name) throws
ClassNotFoundException {
byte[ ] buf=ReadFromBuffer(name);
if(name.equals("MyInterface1")){
return findSystemClass(name);
} else if(buf==null) {
return findSystemClass(name);
} else {
return defineClass(name,buf,0,buf.length);
}
}
№44 слайд
![protected byte ReadFromBuffer](/documents_6/4fd412db7afc6007dba01ec86a38515b/img43.jpg)
Содержание слайда: protected byte[] ReadFromBuffer(String name) throws
protected byte[] ReadFromBuffer(String name) throws
ClassNotFoundException {
FileInputStream in = null;
try {
in = new FileInputStream(name + ".class");
int length = in.available(); // число доступных байтов
if (length == 0) throw
new ClassNotFoundException(name);
byte[] buf = new byte[length];
in.read(buf); // Считывание байтов
return buf;
}
catch(FileNotFoundException e){ return null;}
catch(IOException e){ return null;}
finally{
try{ if (in!=null) in.close(); }
catch(IOException e){ }
}
}
№46 слайд
![public class Main public](/documents_6/4fd412db7afc6007dba01ec86a38515b/img45.jpg)
Содержание слайда: public class Main1 {
public class Main1 {
public static void main(String[] args) {
try{
String name="Myclass";
ClassLoader ld=new MyClassLoader();
Class cl=Class.forName(name, true, ld);
Constructor s=cl.getConstructor(int.class);
MyInterface1
ob=(MyInterface1)s.newInstance(
new Integer(8));
System.out.println(ob.func(3,5));
}catch(Exception e){ };
}
}
Скачать все slide презентации Класс Modifier в Java. (Лекция 8) одним архивом:
Похожие презентации
-
Язык программирования JAVA. Классы коллекций
-
Классы-оболочки в Java. (Лекция 7)
-
Подготовка класса к использованию в Java. (Лекция 9)
-
Классификация структур данных. Лекция 2
-
Основы программирование: Введение в Java. Коллекции
-
Обработка событий в JavaScript. Лекция 9
-
Основные конструкции языка Java. Лекция 6
-
Java. Абстрактные классы и интерфейсы
-
Основные элементы класса: поля, методы, конструкторы, декструкторы, свойства. Лекция 3
-
Связи между классами. Объектно-ориентированное программирование. (Лекция 3)