105 votes

Comment importer une classe d'un paquet par défaut

Double Possible: Comment accéder à java les classes par défaut dans le package?


Je suis à l'aide d'Eclipse 3.5 et j'ai créé un projet avec un paquet de la structure avec le package par défaut. J'ai une classe dans le package par défaut - Calculations.java et je tiens à rendre l'utilisation de cette classe dans l'un des colis (par exemple dans com.de l'entreprise.calc). Lorsque j'essaie de rendre l'utilisation de la classe qui est package par défaut, sa me donne erreur de compilation. Ses pas en mesure de reconnaître la classe dans le package par défaut. Où est-elle un problème?

Calculations.java - code source

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

Je peux mettre ma classe dans n'importe quel autre paquet. Cette classe a une certaine méthode native qui est mis en œuvre dans Delphi . Si j'ai mis que de la classe dans tout le dossier,je vais devoir faire le changement que DLL qui je veux éviter(vraiment - je ne peux pas). C'est pourquoi j'ai mis ma classe dans le package par défaut.

92voto

McDowell Points 62645

A partir de la spécification du langage Java :

Il s'agit d'une erreur de compilation lors de l'importation d'un type à partir du package non nommé.

Vous devrez accéder à la classe via une réflexion ou une autre méthode indirecte.

55voto

matt b Points 73770

Les classes du package par défaut ne peuvent pas être importées par les classes des packages. C'est pourquoi vous ne devez pas utiliser le package par défaut.

5voto

Harshal Malshe Points 41

Je peux vous donner à cette suggestion, Aussi loin que le savoir de mon C et C++ expérience de la Programmation, Une fois, quand j'ai eu le même un peu le problème, je l'ai résolu en modifiant le fichier dll écrites structure ".C" Fichier en changeant le nom de la fonction qui a mis en place la JNI fonctionnalités en natif. par exemple, Si vous souhaitez ajouter votre programme dans le package "com.mypackage", Vous modifier le prototype de la JNI de mise en œuvre ".C" du Fichier de la fonction/méthode de celui-ci:

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
}

Depuis que je suis nouveau à delphes, je ne peux pas vous garantir, mais dis enfin, (j'ai appris quelques choses après une recherche sur google à propos de Delphi et de la JNI): Demandez à ces gens (Si vous n'êtes pas celui qui a fourni le Delphi mise en œuvre du code natif pour changer les noms de fonction à quelque chose comme ceci:

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;

Mais, Un dernier conseil: Même si vous (Si vous êtes le programmeur delphi) ou vous changeront les prototypes de ces fonctions et de recompiler le fichier dll, une fois le fichier dll est compilé, vous ne pourrez pas modifier le nom du package de votre "Java" fichier de nouveau et de nouveau. Car, ce sera encore besoin de vous ou à modifier les prototypes des fonctions dans delphi avec le changement des préfixes (par exemple JAVA_yourpackage_with_underscores_for_inner_packages_javafilename_methodname)

Je pense que cela résout le problème. Merci et salutations, Harshal Malshe

5voto

Adnan Ghaffar Points 98

De certains où j'ai trouvé ci-dessous: -

En fait, vous pouvez.

En utilisant l'API de réflexion, vous pouvez accéder à n'importe quelle classe jusqu'à présent. Au moins j'ai pu :)

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

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

3voto

Jon Points 891

Malheureusement, vous ne pouvez pas importer une classe sans qu'il soit dans un package. C'est l'une des raisons pour laquelle il est fortement déconseillée. Ce que je voudrais essayer, c'est une sorte de proxy-mettre votre code dans un package qui peut tout utiliser, mais si vous avez vraiment besoin de quelque chose dans le package par défaut, en faire une classe très simple qui transfère les appels à la classe avec le code réel. Ou, encore plus simple, il suffit d'avoir l'étendre.

Pour donner un exemple:

--
importer mon.emballés.DefaultClass;

public class MyDefaultClass s'étend DefaultClass {}

--
package de mon.emballés.DefaultClass;

public class DefaultClass {

// Le Code ici

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X