sourcecode

기본 패키지에서 클래스를 가져오는 방법

copyscript 2022. 9. 13. 22:10
반응형

기본 패키지에서 클래스를 가져오는 방법

중복 가능성:디폴트 패키지 내의 Java-classes에 액세스하려면 어떻게 해야 합니까?


저는 Eclipse 3.5를 사용하고 있으며 기본 패키지와 함께 패키지 구조를 가진 프로젝트를 만들었습니다.디폴트 패키지에는 Calculations.java라는 클래스가1개 있는데, 그 클래스를 임의의 패키지로 사용하고 싶습니다(예를 들어,com.company.calc기본 패키지에 있는 클래스를 사용하려고 하면 컴파일러 오류가 발생합니다.기본 패키지의 클래스를 인식할 수 없습니다.어디가 문제입니까?

Calculations.java - 소스 코드

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

내 수업은 다른 패키지에 담을 수 없어요.이 클래스에는 델파이로 구현되는 네이티브 메서드가 몇 가지 있습니다.이 클래스를 폴더에 넣으면 피하고 싶은 DLL을 변경해야 합니다(실제로 - 할 수 없습니다).그래서 내 수업을 기본 패키지에 넣은 거야.

Java 언어 사양에서:

이름 없는 패키지에서 유형을 가져오는 것은 컴파일 시간 오류입니다.

반영이나 다른 간접적인 방법으로 수업에 접속해야 합니다.

기본 패키지의 클래스는 패키지의 클래스로 가져올 수 없습니다.따라서 기본 패키지를 사용하면 안 됩니다.

문제에 대한 해결 방법이 있습니다.이를 달성하기 위해 반사를 사용할 수 있습니다.

먼저 타겟클래스의 인터페이스를 만듭니다.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");
    }
}

마지막으로 리플렉션(reflection)을 사용하여Calculations클래스 및 유형 변수에 할당합니다.CalculationsInterface:

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

이 제안을 드릴 수 있습니다.C와 C++ 프로그래밍 경험으로 알 수 있는 한, 같은 문제가 생겼을 때 "에 기재된 dll 구조를 변경하여 해결했습니다.C" 파일: JNI 네이티브 기능을 구현한 함수의 이름을 변경합니다.예를 들어 "com.mypackage" 패키지에 프로그램을 추가하려면 "를 구현하는 JNI의 프로토타입을 변경합니다.C" 파일의 기능/방법:

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
}

델파이는 처음이라 장담할 수 없지만 마지막으로 이렇게 말할게요(델파이와 JNI에 대해 검색해 본 결과 몇 가지 알게 되었습니다).네이티브 코드의 델파이 실장을 제공한 담당자(그렇지 않은 경우)에게 다음과 같이 함수 이름을 변경하도록 요청하십시오.

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;

하지만, 마지막 조언은:사용자(델파이 프로그래머인 경우) 또는 사용자가 이러한 함수의 프로토타입을 변경하고 dll 파일을 다시 컴파일하지만 dll 파일이 컴파일되면 "Java" 파일의 패키지 이름을 다시 변경할 수 없습니다.이렇게 하면 다시 프리픽스가 변경된 delphi의 함수 프로토타입(예: JAVA_yourpackage_with_underscores_for_inner_packages_JavaFileName)을 변경해야 합니다.메서드명)

이걸로 문제가 해결된 것 같아요.고맙고 안부를 전합니다, 하르살 말쉬

아래에 기재되어 있는 것부터 :-

사실, 할 수 있어요.

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

안타깝게도 패키지에 들어 있지 않으면 클래스를 가져올 수 없습니다.이것이 그것이 매우 낙담하는 이유 중 하나이다.제가 시도하고 싶은 것은 일종의 프록시입니다. 어떤 것이든 사용할 수 있는 패키지에 코드를 넣습니다.그러나 디폴트 패키지에 필요한 것이 있으면, 리얼 코드로 콜을 클래스에 전송하는 매우 간단한 클래스를 만듭니다.또는 단순히 연장만 하면 됩니다.

예를 들면:

import my.packaged.DefaultClass;

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

public class DefaultClass {

   // Code here

}

새 패키지를 만든 다음 새 패키지로 기본 패키지의 클래스를 이동하고 해당 클래스를 사용합니다.

  1. 새 패키지를 만듭니다.
  2. 파일을 기본 패키지에서 새 패키지로 이동합니다.
  1. 예를 들어 프로젝트에 "루트" 패키지(폴더)를 만듭니다.

    패키지 소스; (/path_to_project/source/)

  2. YourClass.class를 소스 폴더로 이동합니다(/path_to_project/source/YourClass.class).

  3. 이렇게 가져오기

    Import 소스클래스

언급URL : https://stackoverflow.com/questions/2193226/how-to-import-a-class-from-default-package

반응형