Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.20;
Скачать: CL | DM;

Вниз

C# и Java   Найти похожие ветки 

 
M234   (2005-01-25 12:46) [0]

Даа. Дела творяться. Прешел сейчас с Java на C#. Вот это средство с программирования с большой буквы. Все равно что с запорожца на на мерс пересесть. По всем статьям Java за пояс затыкает. Интересно сколько еще Java сможет продержаться? И как решится вопрос с C# для юниксовых систем?


 
Чеширский_Кот ©   (2005-01-25 12:48) [1]

а какую IDE используешь?


 
kirasukii   (2005-01-25 12:49) [2]

А интересно с java 1.5 сравнить. Помоему за .NET гонится.


 
iZEN ©   (2005-01-26 00:04) [3]

Что мне не нравится в C# - так это без документации невозможно узнать, какие исключения выбрасываются в методе скомпилированного класса...


 
iZEN ©   (2005-01-26 00:08) [4]

И ещё. C#-классы "летать" не могут. То есть в Java есть такое понятие как динамическая загруска кода из разных источников в процессе исполнения программы: когда код действительно понадобится, он может загружаться из какого-то удалённого источника, CODEBASE которого прописан в свойствах JRE. Например, это может быть не только диск, но и БД или LDAP, URL которого передаётся провайдеру доступа (Spi). Для .Net это НЕДОСТУПНО - нужно изобретать свои механизмы.


 
M234   (2005-01-26 08:06) [5]

У нет философия несколько иная, а следовательно и технология работы с ней будет отлична. Но другой не значит плохой, просто в Net вникнуть надо и мышление перекроить.


 
07BB:080Dh   (2005-01-26 08:19) [6]

iZEN ©   (26.01.05 00:08) [4]

не подскажеш где взять пример подключения програмно jar файла?
то есть прога запускается и из локальных папок подключает jar


 
iZEN ©   (2005-01-27 14:07) [7]

К 07BB:080Dh   (26.01.05 08:19) [6].
"Программное подключение Jar-файла" - это как?
jar - это контейнер для ресурсов и байткода. Например, чтобы использовать какой-либо класс, реализующий известный интерфейс (java.lang.Runnable, например) и запакованный в Jar на каком-то ресурсе, можно сделать так:
1) Прочитать Jar - в байтовый поток;
2) Распаковать в байтовый массив элемент с байткодом класса;
3) Инстанцировать класс из байткода в суперкласс (Class);
4) Инстанцировать объект из класса под известный интерфейс (Runnable) и "запустить" (вызвать известный метод интерфейса).
Пример.
package floresiris.demo;
/** "Летающий" класс */
public class FlyClass implements Runnable {
   public void run() {
       System.out.println("DONE!!!");
   }
}


import java.io.*;
import java.net.*;
import java.util.jar.*;
/** Запускатель */
public class FlyClassTest {
   public static void main(String[] args) {
       try {
           /* Читаем архив из ресурса */
           System.out.print("Read resource...");
           String urlresource = "file:/d:/Temp/demo.jar";
           URL url = new URL(urlresource);
           URLConnection con = url.openConnection();
           InputStream is = con.getInputStream();
           System.out.println("done.");
           /* Инстанцируем класс из потока */
           System.out.print("Instancing resource...");
           String className = "floresiris.demo.FlyClass";
           MyClassLoader loader = new MyClassLoader(is);
           Class c = loader.findClass(className);
           Runnable r = (Runnable)c.newInstance();
           System.out.println("done.");
           System.out.print("Running resource...");
           new Thread(r).start();
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}
class MyClassLoader extends ClassLoader {
   private InputStream is;
   public MyClassLoader(InputStream is) {
       this.is = is;
   }
   public Class findClass(String name) {
       try {
           byte[] buffer = new byte[1000];
           int len = buffer.length;
           JarInputStream jis = new JarInputStream(is);
           JarEntry je = jis.getNextJarEntry();
           String name0 = je.getName();
           System.out.println("Элемент: " + name0);
           name0.replace("/", ".");
           int split = name0.indexOf(".class");
           name0 = name.substring(0, split);
           System.out.println("Новый Элемент: " + name0);
           if ((name0 != null) && name0.equals(name)) {
               /* Получаем массив байткода */
               len = jis.read(buffer);//Распаковали
               /* Отладочная информация - выводит байткод класса */
               for (int i = 0; i < len; i++) {
                   System.out.print(" " + buffer[i]);
                   if (i % 16 == 0) System.out.println();
               }
               System.out.println();
           }
           /* Возвращаем определимый класс */
           return defineClass(name, buffer, 0, len);
       } catch (Exception e) {
           e.printStackTrace();
       }
       return null;
   }
}

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


 
iZEN ©   (2005-01-27 14:15) [8]

Вывод в консоли:
Read resource...done.
Instancing resource...Элемент: floresiris/demo/FlyClass.class
Новый Элемент: floresiris.demo.FlyClass
-54
-2 -70 -66 0 0 0 46 0 33 1 0 24 102 108 111 114
101 115 105 114 105 115 47 100 101 109 111 47 70 108 121 67
108 97 115 115 7 0 1 1 0 16 106 97 118 97 47 108
97 110 103 47 79 98 106 101 99 116 7 0 3 1 0 18
106 97 118 97 47 108 97 110 103 47 82 117 110 110 97 98
108 101 7 0 5 1 0 6 60 105 110 105 116 62 1 0
3 40 41 86 1 0 4 67 111 100 101 12 0 7 0 8
10 0 4 0 10 1 0 15 76 105 110 101 78 117 109 98
101 114 84 97 98 108 101 1 0 18 76 111 99 97 108 86
97 114 105 97 98 108 101 84 97 98 108 101 1 0 4 116
104 105 115 1 0 26 76 102 108 111 114 101 115 105 114 105
115 47 100 101 109 111 47 70 108 121 67 108 97 115 115 59
1 0 3 114 117 110 1 0 16 106 97 118 97 47 108 97
110 103 47 83 121 115 116 101 109 7 0 17 1 0 3 111
117 116 1 0 21 76 106 97 118 97 47 105 111 47 80 114
105 110 116 83 116 114 101 97 109 59 12 0 19 0 20 9
0 18 0 21 1 0 7 68 79 78 69 33 33 33 8 0
23 1 0 19 106 97 118 97 47 105 111 47 80 114 105 110
116 83 116 114 101 97 109 7 0 25 1 0 7 112 114 105
110 116 108 110 1 0 21 40 76 106 97 118 97 47 108 97
110 103 47 83 116 114 105 110 103 59 41 86 12 0 27 0
28 10 0 26 0 29 1 0 10 83 111 117 114 99 101 70
105 108 101 1 0 13 70 108 121 67 108 97 115 115 46 106
97 118 97 0 33 0 2 0 4 0 1 0 6 0 0 0
2 0 1 0 7 0 8 0 1 0 9 0 0 0 47 0
1 0 1 0 0 0 5 42 -73 0 11 -79 0 0 0 2
0 12 0 0 0 6 0 1 0 0 0 2 0 13 0 0
0 12 0 1 0 0 0 5 0 14 0 15 0 0 0 1
0 16 0 8 0 1 0 9 0 0 0 55 0 2 0 1
0 0 0 9 -78 0 22 18 24 -74 0 30 -79 0 0 0
2 0 12 0 0 0 10 0 2 0 0 0 4 0 8 0
5 0 13 0 0 0 12 0 1 0 0 0 9 0 14 0
15 0 0 0 1 0 31 0 0 0 2 0 32
done.
Running resource...DONE!!!


Основные моменты.
1) Класс FlyClass находится в отдельном архиве (в нашем случае в d:\Temp\demo.jar);
2) FlyClassTest находится в другом месте и знает:
* откуда можно загрузить  "Летающий класс";
* имя "Летающего класса";
* то, что FlyClass имплементирует интерфейс java.lang.Runnable. Всё. Про другие методы ему неизвестно (Если будет нужно, то методом рефлексии можно получить всю поднаготную класса).


 
wl ©   (2005-01-27 14:20) [9]

век живи, век учись...


 
Skier ©   (2005-01-27 14:22) [10]


> Интересно сколько еще Java сможет продержаться?

Долго.

> И как решится вопрос с C# для юниксовых систем?

Как напишут FrameWork для юниксовых систем так и решится (в основном). Но пока не вышел Longhorn думаю сильных изменений не будет...



Страницы: 1 вся ветка

Текущий архив: 2005.02.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.045 c
1-1107446586
Muhan
2005-02-03 19:03
2005.02.20
Распечатка и кое-что еще...


1-1107525031
Alexander Makhanev
2005-02-04 16:50
2005.02.20
узнать время неактивности юзера...


3-1106208891
Colci
2005-01-20 11:14
2005.02.20
Помогите разобраться с датами


3-1106207417
АМБ
2005-01-20 10:50
2005.02.20
DBGrid. Работа скролинга.


3-1106587137
Alexander Panov
2005-01-24 20:18
2005.02.20
BLOBField - FireBird Embedded 1.5