Siema!
Załóżmy ze mam bibliotekę bib.jar a w niej od razu jxp.class (bez package) i nie wiem co wpisać żeby ją zaimportować. Próbowałem: [code]import jxp;[/code] i pokazywało błąd. Proszę o pomoc.
Siema!
Załóżmy ze mam bibliotekę bib.jar a w niej od razu jxp.class (bez package) i nie wiem co wpisać żeby ją zaimportować. Próbowałem: [code]import jxp;[/code] i pokazywało błąd. Proszę o pomoc.
zdaje mi sie ze nie musisz nic importowac :)
Niestety nie działa :(
ale czy możliwe jest zrobienie biblioteki bez pakietu z której możne korzystać program ?
Tak może, ale jest jeden warunek - Twoje klasy też nie mogą być w pakietach.
hmm..zrobienie-nie no po to są pakiety by z nich korzystać. A jak chcesz użyć klasy z jara bez pakietu to wyciągnij klase z jara i wsadz ją do swoich skompilowanych klas (ta klasa która będzie używac tej bibliotecznej klasy oczywiście też musi być bez pakietu). Trochę to durne ale zadziała.
Nic nie trzeba wyciągać z jara. Wystarczy dodać tego jara do classpath.
Niestety nie wystarczy zmienić tylko klas, które bezpośrednio korzystają z tej biblioteki.
Jeżeli klasa A z naszego projektu korzysta z tego jara, to A nie może mieć pakietu.
Jeżeli klasa B korzysta z A, to B też nie może być w pakiecie.
itd.
Efekt jest taki, że cały projekt nie może mieć pakietów.
--
EDIT:
Można ten problem obejść stosując refleksję.
W tym przypadku nie musimy nic importować z tej biblioteki (tylko musi być w classpath)
Class c = Class.forName("A"); //klasa bez pakietu
Object o = c.newInstance();
Method m = c.getMethod("a");
m.invoke(o);
hehe dokładnie mi to samo się nasunęło rano - CustomClassLoader rozwiąże Ci problem.
Jak widzicie klasa Klasa.class nie ma package i znajduje się w bibliotece która dodałem w netBeans
i teraz co mam wpisać w klasie Main.class żeby załadować klasę Klasa.class
Hello piszę z pamięci więc wiesz ...
Pierw sobie napisz interfejs w którym będą zawierać się wszystkie metody z tej klasy. Coś takiego:
public interface mojInterfejs {
public boolean metodaSraka(String pikupiku); //przyklad metody
.
.
.//coraz to nowe metody z Twojej klasy klasa.class
.
}
Teraz stwórz klasę która będzie implementować Twój interfejs:
public class klasa.Class implements mojInterfejs {
public klasa.Class() {}
public booleanmetodaSraka(String pikupiku); // i inne metodki
}
A teraz kwintesencja:
import java.io.*;
public class CustomClassLoader extends ClassLoader {
private CustomClassLoader() {
super(CustomClassLoader.class.getClassLoader());
}
public static CustomClassLoader getInstance() {
if (instance == null) {
instance = new CustomClassLoader();
}
return instance;
}
public String toString() {
return CustomClassLoader.class.getName();
}
public Class findClass(String name) {
String file = name.replace('.', File.separatorChar) + ".class";
byte[] b = null;
try {
b = loadClassData(file);
Class c = defineClass(name, b, 0, b.length);
resolveClass(c);
return c;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private byte[] loadClassData(String name) throws Exception {
File file = new File(name);
int size = (int)file.length();
byte buff[] = new byte[size];
DataInputStream in = new DataInputStream(new FileInputStream(name));
in.readFully(buff);
in.close();
return buff;
}
private static CustomClassLoader instance;
}
No i wywołanie tego wszystkiego:
public class Test {
public static void main(String[] args) throws Exception {
CustomClassLoader cl = CustomClassLoader.getInstance();
Class ca = cl.findClass("klasa.class");
IA ia = (IA)ca.newInstance();
boolean wynik = ia.metodaSraka("Koniec!!");
System.out.println(wynik);
}
}
I to by było na tyle....
Dzięki powyższemu kodowi bedziesz mógł sobie tworzyć pakiety jakie chcesz i korzystać z klasy bez pakietu i jej metod.
A tak btw to weź sobie zainstaluj DJ Java Decompiler i tą klaśe/klasy w jarze przekształć na kod źródłowy i dodaj pakiety w nich i znowu skompiluj. Chyba najprościej a i źródło zobaczysz.
dzięki za pomoc. :-)