Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> class loader, как знать что класс подгружен 
:(
    Опции темы
sergioK
Дата 4.7.2008, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



в поике искал не нашел разбираю пример 


Код

  package com;

/*
 * Copyright (c) Ian F. Darwin, http://www.darwinsys.com/, 1996-2002.
 * All rights reserved. Software written by Ian F. Darwin and others.
 * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * 
 * Java, the Duke mascot, and all variants of Sun's Java "steaming coffee
 * cup" logo are trademarks of Sun Microsystems. Sun's, and James Gosling's,
 * pioneering role in inventing and promulgating (and standardizing) the Java 
 * language and environment is gratefully acknowledged.
 * 
 * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for
 * inventing predecessor languages C and C++ is also gratefully acknowledged.
 */

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Hashtable;

/**
 * Demonstration of a ClassLoader
 */
public class ClassLoaderDemo1 extends ClassLoader {
  /** The Hashtable to keep track of classes, to avoid re-loading them */
  protected Hashtable cache = new Hashtable();

  /** data's expected length */
  private final int dataLength = 433;

  /** data, obtained by dumping a compiled .class file */
  private int[] data = { 202, 254, 186, 190, 0, 3, 0, 45, 0, 31, 8, 0, 20, 7,
      0, 17, 7, 0, 25, 7, 0, 26, 7, 0, 27, 10, 0, 4, 0, 9, 9, 0, 5, 0,
      10, 10, 0, 3, 0, 11, 12, 0, 14, 0, 12, 12, 0, 28, 0, 22, 12, 0, 29,
      0, 13, 1, 0, 3, 40, 41, 86, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47,
      108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 86, 1,
      0, 6, 60, 105, 110, 105, 116, 62, 1, 0, 4, 67, 111, 100, 101, 1, 0,
      13, 67, 111, 110, 115, 116, 97, 110, 116, 86, 97, 108, 117, 101, 1,
      0, 4, 68, 101, 109, 111, 1, 0, 9, 68, 101, 109, 111, 46, 106, 97,
      118, 97, 1, 0, 10, 69, 120, 99, 101, 112, 116, 105, 111, 110, 115,
      1, 0, 10, 72, 101, 108, 108, 111, 32, 74, 97, 118, 97, 1, 0, 15,
      76, 105, 110, 101, 78, 117, 109, 98, 101, 114, 84, 97, 98, 108,
      101, 1, 0, 21, 76, 106, 97, 118, 97, 47, 105, 111, 47, 80, 114,
      105, 110, 116, 83, 116, 114, 101, 97, 109, 59, 1, 0, 14, 76, 111,
      99, 97, 108, 86, 97, 114, 105, 97, 98, 108, 101, 115, 1, 0, 10, 83,
      111, 117, 114, 99, 101, 70, 105, 108, 101, 1, 0, 19, 106, 97, 118,
      97, 47, 105, 111, 47, 80, 114, 105, 110, 116, 83, 116, 114, 101,
      97, 109, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79,
      98, 106, 101, 99, 116, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97,
      110, 103, 47, 83, 121, 115, 116, 101, 109, 1, 0, 3, 111, 117, 116,
      1, 0, 7, 112, 114, 105, 110, 116, 108, 110, 1, 0, 4, 116, 101, 115,
      116, 0, 33, 0, 2, 0, 4, 0, 0, 0, 0, 0, 2, 0, 9, 0, 30, 0, 12, 0, 1,
      0, 15, 0, 0, 0, 37, 0, 2, 0, 0, 0, 0, 0, 9, 178, 0, 7, 18, 1, 182,
      0, 8, 177, 0, 0, 0, 1, 0, 21, 0, 0, 0, 10, 0, 2, 0, 0, 0, 9, 0, 8,
      0, 8, 0, 1, 0, 14, 0, 12, 0, 1, 0, 15, 0, 0, 0, 29, 0, 1, 0, 1, 0,
      0, 0, 5, 42, 183, 0, 6, 177, 0, 0, 0, 1, 0, 21, 0, 0, 0, 6, 0, 1,
      0, 0, 0, 7, 0, 1, 0, 24, 0, 0, 0, 2, 0, 18 };

  /** "load", that is, make up, the data for the class */
  private byte[] genClassData(String name) {
    if (dataLength != data.length)
      throw new IllegalArgumentException("data corrupt");
    byte[] bd = new byte[data.length];
    for (int i = 0; i < bd.length; i++)
      bd[i] = (byte) data[i];
    return bd;
  }

  public synchronized Class loadClass(String name, boolean resolve)
      throws ClassNotFoundException {
    /**
     * We can expect to be called to resolve at least demo's superclass
     * (java.lang.Object). Fortunatetely, we can just use
     * super.findSystemClass() to load such things...
     */
    if (name.startsWith("java.")) {
      System.out.println("loadClass: SystemLoading " + name);
      
      return findSystemClass(name);
    }
    Class c = (Class) cache.get(name);
    if (c == null) {
      System.out.println("loadClass: About to genClassData " + name);
      byte mydata[] = genClassData(name);
      System.out.println("loadClass: About to defineClass " + name);
      c = defineClass(name, mydata, 0, mydata.length);
      System.out.println("loadClass: storing " + name + " in cache.");
      cache.put(name, c);
    } else
      System.out.println("loadClass: found " + name + " in cache.");
    if (resolve) {
      System.out.println("loadClass: About to resolveClass " + name);
      resolveClass(c);
    }
    return c;
  }

  public static void main(String[] argv) {
    System.out.println("ClassLoaderDemo1 starting");
    ClassLoaderDemo1 loader = new ClassLoaderDemo1();
    Class c = null;
    Object demo1;
   try{
    c = loader.loadClass("Demo", true);
   } catch (ClassNotFoundException e){
       System.err.println(e.getMessage());
   }
    
}
}


 т,е, есть некий класс который назвали demo , не понятно где они его загрузили ?
 и я хочу сделать свой класс скажем  кuku
 как его загружить , что бы class loader его видел ?


PM MAIL   Вверх
LSD
Дата 4.7.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Стандартный алгоритм такой: вначале ClassLoader проверяет родительский класс лоаден не был ли им загружен этот класс. Потом проверяет не был ли он загружен им самим. В примере для хранения загруженных классов используется
Код

protected Hashtable cache = new Hashtable();

Затем если класс не найден, то читается class-файл и вызывается defineClass().


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
sergioK
Дата 4.7.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(LSD @ 4.7.2008,  12:31)
Стандартный алгоритм такой: вначале ClassLoader проверяет родительский класс лоаден не был ли им загружен этот класс. Потом проверяет не был ли он загружен им самим. В примере для хранения загруженных классов используется
Код

protected Hashtable cache = new Hashtable();

Затем если класс не найден, то читается class-файл и вызывается defineClass().

почему если поменять Demo на другое имя то выходит 

Exception in thread "main" java.lang.NoClassDefFoundError: Demo1 (wrong name: Demo)?

c = loader.loadClass("Demo", true);


PM MAIL   Вверх
LSD
Дата 4.7.2008, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Ну так уж и любое, попробуй java.lang.Object smile 

Этот ClassLoader умеет грузить только один класс Demo который зашит в него, ничего другого он грузить не умеет.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
sergioK
Дата 4.7.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(LSD @ 4.7.2008,  14:13)
Ну так уж и любое, попробуй java.lang.Object smile 

Этот ClassLoader умеет грузить только один класс Demo который зашит в него, ничего другого он грузить не умеет.

дак это не понятно , они написали некий класс demo 
как его сделать зашитым ? 

Я проверил с java.awt.Rectangle - работает 
с java.awt.Rectangle  работает  но это java.awt.Rectangle  - таки вшит  в JVM

попробовал 
Код

c = loader.loadClass("com.sun.rowset", true); 


получаю Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/rowset (wrong name: Demo)

в чем разница 


полный пример взят здесь 
http://www.java2s.com/Code/Java/Language-B...ClassLoader.htm

т,е,  дальше  видно что в этом самом demo  есть метод test , и как на это самый demo 
попал в "мою" JVM 


PM MAIL   Вверх
LSD
Дата 4.7.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(sergioK @  4.7.2008,  17:12 Найти цитируемый пост)
дак это не понятно , они написали некий класс demo 
как его сделать зашитым ? 

Интересно ты разбираешься, даже не читаешь сам код smile 
Код

  /** data, obtained by dumping a compiled .class file */
  private int[] data = { 202, 254, 186, 190, 0, 3, 0, 45, 0, 31, 8, 0, 20, 7,

других классов они туда не зашили, а потому он ничего больше и не может грузить (ну кроме стандартных классов, для которых используется системный ClassLoader).

Посмотри пример загрузчика классов у нас в FAQ.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
sergioK
Дата 4.7.2008, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



 как обычно у программеров  smile 
сначало доходишь сам потом находишь тоже самое в документации 
млять никогда не бывает наоборот   smile 

если кому интересно то 

The specified name cannot begin with "java.", since all classes in the "java.* packages can only be defined by the bootstrap class loader. If name is not null, it must be equal to the binary name of the class specified by the byte array "b", otherwise a NoClassDefFoundError will be thrown.


взято http://java.sun.com/j2se/1.5.0/docs/api/ja....String,%20byte[],%20int,%20int)

Это сообщение отредактировал(а) sergioK - 5.7.2008, 09:01
PM MAIL   Вверх
Ratman
Дата 19.7.2008, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 18.8.2007
Где: Минск

Репутация: нет
Всего: нет



Цитата(LSD @ 4.7.2008,  12:31)
Стандартный алгоритм такой: вначале ClassLoader проверяет родительский класс лоаден не был ли им загружен этот класс. Потом проверяет не был ли он загружен им самим.
Затем если класс не найден, то читается class-файл и вызывается defineClass()

А если класс уже однажды был загружен? как его "выгрузить"

У меня алгоритм такой:
1 - создается .class файл
2 - загружается этот класс
3 - используется
4 - немного изменяется .class файл
5 - хотелось бы его перезагрузить и использовать

Но на практике ClassLoader помнит, что такой класс уже загружен, и не загружает новый (измененный) а возвращает уже загруженный.
К тому же findLoadedClass объявлен гадасць как final, значит способов "помешать" найти однажды загруженный класс я не вижу.

ЗЫ: честно, каждый раз менять имя, конечно, не сложно, но уж очень некрасиво.

ЗЗЫ: заранее спасибо

Это сообщение отредактировал(а) Ratman - 19.7.2008, 23:32
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0795 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.