Biblioteka bez package

0

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.

0

zdaje mi sie ze nie musisz nic importowac :)

0
  1. Nigdy nie powinno się tworzyć klas bez pakietu
  2. Jeżeli klasa jest bez pakietu, to mogą z niej skorzystać tylko klasy, które też nie mają pakietu. Czyli w swoim projekcie musiałbyś wszystkie klasy mieć bez pakietów, aby użyć tamtej biblioteki.
0

Niestety nie działa :(

0

ale czy możliwe jest zrobienie biblioteki bez pakietu z której możne korzystać program ?

0

Tak może, ale jest jeden warunek - Twoje klasy też nie mogą być w pakietach.

0

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.

0

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);
0

hehe dokładnie mi to samo się nasunęło rano - CustomClassLoader rozwiąże Ci problem.

0

user image

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

0

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....

0

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.

0

dzięki za pomoc. :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1