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

Возможный Дубликат: Как получить доступ к классам 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, которого я хочу избежать (действительно - я не могу). Вот почему я поместил свой класс в пакет по умолчанию.

89
задан Community 23 May 2017 в 11:54
поделиться

4 ответа

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

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

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

80
ответ дан 24 November 2019 в 07:20
поделиться

Первое, что я хотел бы проверить, это манифест приложения. Это первое, на что Windows смотрит при создании процесса. Он определенно взаимодействует с ОАК.

-121--4144565-

Я использую ссылки для семантики. Рассмотрим такой подход:

void AddResultsTable(ref PlaceHolder p) // modifies p; adding a table
{
    var t = new Table();

    AddTableHeader(ref t); // modifies t; adding a table header

    AddTableBody(ref t);  // modifies t; adding a table body

    AddTableFooter(ref t);  // modifies t; adding a table footer

    p.Controls.Add(t);
}

AddResultsTable(ref PlaceHolderResults);

Против этого:

Table ReturnTable()
{
    var t new Table();

    // AddTableHeader() returns TableHeader
    t.Columns.HeaderColumns.Add(ReturnTableHeader());

    // ... etc.

    return t;
}

PlaceHolder.Controls.Add(ReturnTable());

Первый фрагмент кода выглядит мне чище; методы изменяют объекты, а не возвращают новые объекты, которые, в свою очередь, необходимо добавить.

-121--3375297-

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

44
ответ дан 24 November 2019 в 07:20
поделиться

К сожалению, вы не можете импортировать класс, если он не находится в пакете. Это одна из причин, по которой это крайне не рекомендуется. Я бы попробовал своего рода прокси - поместите свой код в пакет, который может использовать все, но если вам действительно нужно что-то в пакете по умолчанию, сделайте это очень простым классом, который перенаправляет вызовы классу с реальным кодом. Или, что еще проще, просто продлите его.

Приведу пример:

import my.packaged.DefaultClass;

public class MyDefaultClass extends DefaultClass {}
package my.packaged.DefaultClass;

public class DefaultClass {

   // Code here

}
2
ответ дан 24 November 2019 в 07:20
поделиться

Я могу дать вам следующее предложение, Насколько мне известно из моего опыта программирования на C и C++, Однажды, когда у меня была такая же проблема, я решил ее, изменив структуру dll в файле ".C", изменив имя функции, которая реализовывала родную функциональность JNI. Например, если вы хотите добавить свою программу в пакет "com.mypackage", Вы изменяете прототип функции/метода файла ".C", реализующего JNI, на такой:

JNIEXPORT jint JNICALL
Java_com_mypackage_Calculations_Calculate(JNIEnv *env, jobject obj, jint contextId)
{
   //code goes here
}

JNIEXPORT jdouble JNICALL
Java_com_mypackage_Calculations_GetProgress(JNIEnv *env, jobject obj, jint contextId)
{
  //code goes here
}

Так как я новичок в delphi, я не могу гарантировать вам, но скажу вот что, (Я узнал несколько вещей после гугления о Delphi и JNI): Попросите тех людей (если это не вы), которые предоставили реализацию родного кода в Delphi, изменить имена функций на что-то вроде этого:

function Java_com_mypackage_Calculations_Calculate(PEnv: PJNIEnv; Obj: JObject; contextId: JInt):JInt; {$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
var
//Any variables you might be interested in
begin
  //Some code goes here
end;



function Java_com_mypackage_Calculations_GetProgress(PEnv: PJNIEnv; Obj: JObject; contextId: JInt):JDouble; {$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
var
//Any variables you might be interested in
begin
//Some code goes here
end;

Но, последний совет: Хотя вы (если вы программист delphi) или они изменят прототипы этих функций и перекомпилируют файл dll, после того, как файл dll будет скомпилирован, вы не сможете изменить имя пакета вашего "Java" файла снова и снова. Потому что это снова потребует от вас или от них изменения прототипов функций в delphi с измененными префиксами (например, JAVA_ваш пакет_с_недостатками_для_внутренних_пакетов_JavaFileName_MethodName)

Думаю, это решит проблему. Спасибо и с уважением, Harshal Malshe

4
ответ дан 24 November 2019 в 07:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: