Возможный дубликат: как получить доступ к java-классам в пакете по умолчанию?
Я использую Eclipse 3.5, и я создал проект с некоторой структурой пакета вместе с пакетом по умолчанию. У меня есть один класс в пакете по умолчанию - Calculations.java, и я хочу использовать этот класс в любом пакете (например, в com.company.calc
). Когда я пытаюсь использовать класс, который находится в пакете по умолчанию, он выдает ошибку компилятора. Он не может распознать класс в пакете по умолчанию. В чем проблема?
Calculations.java - исходный код
public class Calculations {
native public int Calculate(int contextId);
native public double GetProgress(int contextId);
static {
System.loadLibrary("Calc");
}
}
Я не могу поместить свой класс в какой-либо другой пакет. Этот класс имеет несколько собственных методов, реализованных в Delphi. Если я помещу этот класс в любую из папок, мне придется внести изменения в эту DLL, которых я хочу избежать (на самом деле - я не могу). Вот почему я поместил свой класс в пакет по умолчанию.
источник
Ответы:
Из спецификации языка Java :
Вам нужно будет получить доступ к классу через отражение или другой косвенный метод.
источник
Классы в пакете по умолчанию не могут быть импортированы классами в пакетах. Вот почему вам не следует использовать пакет по умолчанию.
источник
У вашей проблемы есть обходной путь. Для этого можно использовать отражение.
Сначала создайте интерфейс для вашего целевого класса
Calculatons
:Затем сделайте так, чтобы ваш целевой класс реализовал этот интерфейс :
Наконец, используйте отражение, чтобы создать экземпляр
Calculations
класса и присвоить его переменной типаCalculationsInterface
:источник
Я могу дать вам это предложение. Насколько мне известно из моего опыта программирования на C и C ++, однажды, когда у меня была такая же проблема, я решил ее, изменив структуру, записанную dll в файле ".C", изменив имя файла функция, которая реализует встроенную функциональность JNI. например, если вы хотите добавить свою программу в пакет "com.mypackage", вы меняете прототип JNI, реализующего функцию / метод файла ".C", на этот:
Поскольку я новичок в delphi, я не могу гарантировать вам, но скажу это наконец (я узнал несколько вещей после поиска в Google о Delphi и JNI): Спросите тех людей (если вы не тот), кто предоставил Delphi-реализацию собственного код, чтобы изменить имена функций на что-то вроде этого:
Но последний совет: хотя вы (если вы программист delphi) или они измените прототипы этих функций и перекомпилируете файл dll, после компиляции файла dll вы не сможете изменить имя пакета вашего Снова и снова файл "Java". Потому что это снова потребует от вас или их изменения прототипов функций в delphi с измененными префиксами (например, JAVA_yourpackage_with_underscores_for_inner_packages_JavaFileName_MethodName)
Думаю, это решает проблему. С уважением и уважением, Харшал Малше
источник
Откуда я нашел ниже: -
Фактически, вы можете.
Используя API отражений, вы можете получить доступ к любому классу на данный момент. По крайней мере, мне удалось :)
источник
К сожалению, вы не можете импортировать класс, если он не находится в пакете. Это одна из причин, по которой это крайне не рекомендуется. Я бы попробовал использовать своего рода прокси - поместите свой код в пакет, который может использовать все, но если вам действительно нужно что-то в пакете по умолчанию, сделайте это очень простым классом, который перенаправляет вызовы классу с реальным кодом. Или, что еще проще, просто расширьте его.
Чтобы привести пример:
источник
Создайте новый пакет, а затем переместите классы пакета по умолчанию в новый пакет и используйте эти классы
источник
источник
Создайте, например, «корневой» пакет (папку) в вашем проекте.
исходный код пакета; (... / путь_к_проекту / источник /)
Переместите YourClass.class в исходную папку. (... / путь_к_проекту / источник / YourClass.class)
Импортировать как это
источник импорта.YourClass;
источник