Текущий архив: 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.48 MB
Время: 0.04 c