Możliwy duplikat: Jak uzyskać dostęp do klas java w pakiecie domyślnym?
Używam Eclipse 3.5 i utworzyłem projekt z pewną strukturą pakietu wraz z pakietem domyślnym. Mam jedną klasę w domyślnym pakiecie - Calculations.java i chcę użyć tej klasy w dowolnym pakiecie (na przykład w com.company.calc
). Kiedy próbuję użyć klasy, która jest w domyślnym pakiecie, wyświetla mi się błąd kompilatora. Nie jest w stanie rozpoznać klasy w domyślnym pakiecie. Gdzie jest problem?
Calculations.java - kod źródłowy
public class Calculations {
native public int Calculate(int contextId);
native public double GetProgress(int contextId);
static {
System.loadLibrary("Calc");
}
}
Nie mogę umieścić mojej klasy w żadnym innym pakiecie. Ta klasa ma kilka natywnych metod, które są zaimplementowane w Delphi. Jeśli umieszczę tę klasę w którymkolwiek z folderów, będę musiał wprowadzić zmiany w tej bibliotece DLL, których chcę uniknąć (naprawdę - nie mogę). Dlatego umieściłem moją klasę w domyślnym pakiecie.
źródło
Odpowiedzi:
Ze specyfikacji języka Java :
Będziesz musiał uzyskać dostęp do klasy poprzez odbicie lub inną pośrednią metodę.
źródło
Klasy w pakiecie domyślnym nie mogą być importowane przez klasy w pakietach. Dlatego nie powinieneś używać domyślnego pakietu.
źródło
Istnieje obejście problemu. Aby to osiągnąć, możesz użyć refleksji.
Najpierw utwórz interfejs dla swojej klasy docelowej
Calculatons
:Następnie spraw, aby klasa docelowa implementowała ten interfejs :
Na koniec użyj refleksji, aby utworzyć instancję
Calculations
klasy i przypisać ją do zmiennej typuCalculationsInterface
:źródło
Mogę dać ci tę sugestię, o ile wiem z mojego doświadczenia w programowaniu C i C ++. Kiedyś, gdy miałem ten sam problem, rozwiązałem go, zmieniając zapisaną strukturę dll w pliku „.C”, zmieniając nazwę pliku funkcja, która zaimplementowała natywną funkcjonalność JNI. na przykład, jeśli chcesz dodać swój program w pakiecie „com.mypackage”, zmieniasz prototyp funkcji / metody JNI implementującej plik „.C” na ten:
Ponieważ jestem nowy w Delphi, nie mogę Ci zagwarantować, ale powiem to na koniec (dowiedziałem się kilku rzeczy po googlowaniu o Delphi i JNI): Zapytaj tych ludzi (jeśli nie jesteś tym jedynym), którzy dostarczyli implementację natywnego Delphi kod, aby zmienić nazwy funkcji na takie:
Ale ostatnia rada: chociaż Ty (jeśli jesteś programistą delphi) lub oni zmienisz prototypy tych funkcji i ponownie skompilujesz plik dll, po skompilowaniu pliku dll nie będziesz w stanie zmienić nazwy pakietu swojego Plik „Java” ponownie i ponownie. Ponieważ to ponownie będzie wymagało od Ciebie lub ich zmiany prototypów funkcji w delphi ze zmienionymi prefiksami (np. JAVA_yourpackage_with_underscores_for_inner_packages_JavaFileName_MethodName)
Myślę, że to rozwiązuje problem. Dzięki i pozdrawiam, Harshal Malshe
źródło
Z niektórych, gdzie znalazłem poniżej: -
W rzeczywistości możesz.
Używając reflections API, możesz uzyskać dostęp do dowolnej dotychczasowej klasy. Przynajmniej udało mi się :)
źródło
Niestety nie możesz zaimportować klasy, jeśli nie znajduje się ona w pakiecie. Jest to jeden z powodów, dla których jest to wysoce odradzane. To, co chciałbym, to coś w rodzaju proxy - umieść swój kod w pakiecie, którego każdy może użyć, ale jeśli naprawdę potrzebujesz czegoś w domyślnym pakiecie, uczyń tę bardzo prostą klasę, która przekazuje wywołania do klasy z prawdziwym kodem. Lub jeszcze prościej, po prostu przedłuż.
Dać przykład:
źródło
Utwórz nowy pakiet A następnie przenieś klasy domyślnego pakietu do nowego pakietu i użyj tych klas
źródło
źródło
Na przykład utwórz pakiet „główny” (folder) w swoim projekcie.
źródło pakietu; (... / ścieżka_do_projektu / źródło /)
Przenieś YourClass.class do folderu źródłowego. (... / ścieżka_do_projektu / źródło / TwojaKlasa.class)
Importuj w ten sposób
źródło importu.YourClass;
źródło