Вопрос-ответ

How to import a class from default package

Как импортировать класс из пакета по умолчанию

Возможный дубликат: Как получить доступ к java-классам в пакете по умолчанию?



Я использую Eclipse 3.5 и создал проект с некоторой структурой пакета вместе с пакетом по умолчанию. У меня есть один класс в пакете по умолчанию - Вычисления.java и я хочу использовать этот класс в любом пакете (например, в com.company.calc). Когда я пытаюсь использовать класс, который находится в пакете по умолчанию, он выдает мне ошибку компилятора. Он не может распознать класс в пакете по умолчанию. В чем проблема?

Вычисления.java - исходный код

public class Calculations {
native public int Calculate(int contextId);
native public double GetProgress(int contextId);
static {
System.loadLibrary("Calc");
}
}

Я не могу поместить свой класс ни в какой другой пакет. У этого класса есть некоторые собственные методы, которые реализованы в Delphi. Если я помещу этот класс в любую из папок, мне придется внести изменения в эту DLL, которых я хочу избежать (на самом деле - я не могу). Вот почему я поместил свой класс в пакет по умолчанию.

Переведено автоматически
Ответ 1

Из спецификации языка Java:


Импорт типа из неназванного пакета является ошибкой времени компиляции.


Вам придется получить доступ к классу через отражение или какой-либо другой косвенный метод.

Ответ 2

Классы в пакете по умолчанию не могут быть импортированы классами в пакетах. Вот почему вам не следует использовать пакет по умолчанию.

Ответ 3

Для вашей проблемы есть обходной путь. Вы можете использовать отражение для ее решения.

Сначала создайте интерфейс для вашего целевого класса Calculatons :

package mypackage;

public interface CalculationsInterface {
int Calculate(int contextId);
double GetProgress(int contextId);

}

Затем создайте свой целевой класс, реализующий этот интерфейс:

public class Calculations implements mypackage.CalculationsInterface {
@Override
native public int Calculate(int contextId);
@Override
native public double GetProgress(int contextId);
static {
System.loadLibrary("Calc");
}
}

Наконец, используйте отражение для создания экземпляра Calculations класса и присвоения ему переменной типа CalculationsInterface :

Class<?> calcClass = Class.forName("Calculations");
CalculationsInterface api = (CalculationsInterface)calcClass.newInstance();
// Use it
double res = api.GetProgress(10);
Ответ 4

Из того, что я нашел ниже :-

На самом деле, вы можете.

Используя reflections API, вы можете получить доступ к любому классу на данный момент. По крайней мере, я смог :)

Class fooClass = Class.forName("FooBar");
Method fooMethod =
fooClass.getMethod("fooMethod", new Class[] { String.class });

String fooReturned =
(String) fooMethod.invoke(fooClass.newInstance(), "I did it");
java