Dupliquer possible: comment accéder aux classes java dans le package par défaut?
J'utilise Eclipse 3.5 et j'ai créé un projet avec une structure de package avec le package par défaut. J'ai une classe dans le package par défaut - Calculations.java et je souhaite utiliser cette classe dans l'un des packages (par exemple dans com.company.calc
). Lorsque j'essaye d'utiliser la classe qui se trouve dans le package par défaut, cela me donne une erreur de compilation. Il ne peut pas reconnaître la classe dans le package par défaut. Où est le 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 ne peux mettre ma classe dans aucun autre package. Cette classe a des méthodes natives qui sont implémentées dans Delphi. Si je mets cette classe dans l'un des dossiers, je devrai apporter des modifications à cette DLL que je veux éviter (vraiment - je ne peux pas). C'est pourquoi j'ai mis ma classe dans le package par défaut.
la source
Réponses:
À partir de la spécification du langage Java :
Vous devrez accéder à la classe via la réflexion ou une autre méthode indirecte.
la source
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.
la source
Il existe une solution de contournement à votre problème. Vous pouvez utiliser la réflexion pour y parvenir.
Tout d'abord, créez une interface pour votre classe cible
Calculatons
:Ensuite, faites en sorte que votre classe cible implémente cette interface :
Enfin, utilisez la réflexion pour créer une instance de
Calculations
classe et l'assigner à une variable de typeCalculationsInterface
:la source
Je peux vous donner cette suggestion, pour autant que je sache de mon expérience de programmation C et C ++, Une fois, quand j'ai eu le même problème, je l'ai résolu en changeant la structure écrite par DLL dans le fichier ".C" en changeant le nom du fonction qui a implémenté la fonctionnalité native JNI. par exemple, si vous souhaitez ajouter votre programme dans le package "com.mypackage", vous changez le prototype du JNI implémentant la fonction / méthode du fichier ".C" en celui-ci:
Puisque je suis nouveau chez Delphi, je ne peux pas vous garantir mais je vais le dire enfin, (j'ai appris peu de choses après avoir googlé à Delphi et JNI): Demandez à ces personnes (si vous n'êtes pas celui) qui ont fourni l'implémentation Delphi du natif code pour changer les noms des fonctions en quelque chose comme ceci:
Mais, un dernier conseil: bien que vous (si vous êtes le programmeur delphi) ou eux modifiez les prototypes de ces fonctions et recompilez le fichier dll, une fois le fichier dll compilé, vous ne pourrez pas changer le nom du package de votre Fichier "Java" encore et encore. Parce que, cela vous obligera à nouveau à changer les prototypes des fonctions dans delphi avec des préfixes modifiés (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
la source
De certains où j'ai trouvé ci-dessous: -
En fait, vous pouvez.
En utilisant l'API réflexions, vous pouvez accéder à n'importe quelle classe jusqu'à présent. Au moins j'ai pu :)
la source
Malheureusement, vous ne pouvez pas importer une classe sans qu'elle soit dans un package. C'est l'une des raisons pour lesquelles il est fortement déconseillé. Ce que j'essaierais, c'est une sorte de proxy - mettez votre code dans un package que tout peut utiliser, mais si vous avez vraiment besoin de quelque chose dans le package par défaut, faites-en une classe très simple qui transmet les appels à la classe avec le vrai code. Ou, encore plus simple, faites-le simplement s'étendre.
Pour donner un exemple:
la source
Créez un nouveau package, puis déplacez les classes du package par défaut dans un nouveau package et utilisez ces classes
la source
la source
Créez par exemple un package (dossier) "racine" dans votre projet.
source du paquet; (... / chemin_du_projet / source /)
Déplacez YourClass.class dans un dossier source. (... / chemin_du_projet / source / YourClass.class)
Importez comme ça
import source.YourClass;
la source