Est-il possible de créer des variables lors de l'exécution en Java?
Par exemple, dire que je voulais "extrait de" String[] fruits = {"Pear", "Banana", "Apple"};
en trois variables, par exemple:
for (int i=0; i != fruits.length; ++i) {
//of course there's no eval in Java
eval("String fruit + i = " + fruits[i] + ";");
}
//ie: code that creates something equivalent to the following declarations:
String fruit0 = "Pear";
String fruit1 = "Banana";
String fruit2 = "Apple";
Comment pourrais-je le faire, en ignorant le "Pourquoi diable voudriez-vous faire cela?" question que vous pourriez être invités à me demander.
Questions similaires ont été posées de nombreuses fois avant, mais la vraie réponse n'a jamais été donné, parce que ce que l'OP a vraiment besoin, c'était d'utiliser une approche différente. C'est très bien, mais est-ce possible?
J'ai regardé la réflexion et il ne semble pas comme il existe des méthodes qui me permettrait même d'ajouter des champs supplémentaires à une instance, a fortiori, de créer dynamiquement des habitants.
Laissez-moi deviner, vous êtes principalement un programmeur PHP, n'est-ce pas? Suis-je le fermer?
Je pense que
java.lang.reflect.Proxy
est à peu près aussi proche que vous pouvez aller. Même alors, vous ne pouvez mettre en œuvre des choses qui ont été définis au moment de la compilation.Oui, mais vous ne pouvez pas être en mesure de les utiliser en dehors du code créé par le biais du mécanisme (sauf une interface cohérente).
Je n'ai jamais utilisé que (création de nouveaux habitants sur la pile) dans le code réel en PHP/Python/JS, mais le fait est, il est là, si jamais j'ai besoin. L'autre caractéristique, l'ajout dynamique de membres d'une instance, est beaucoup plus utile.
OriginalL'auteur NullUserException | 2011-09-20
Vous devez vous connecter pour publier un commentaire.
La réponse simple est Non.
Java est un langage statique et ne prend pas en charge l'injection de nouvelles déclarations de variables dans un programme compilé. Il existe des alternatives (dans l'ordre décroissant de leur utilité ou à la difficulté croissante):
Map
. Ou venir avec une autre conception qui n'est pas besoin réel des variables dynamiques.La première approche est la meilleure. Java est un langage statique, et qui fonctionne le mieux si vous ne vous battez pas. Si c'est un problème pour vous, peut-être que vous utilisez la mauvaise langue.
Les deux derniers sont difficiles et complexes et ont des coûts de l'exécution. Ils sont presque certainement ne va pas aider ...
OriginalL'auteur Stephen C
La question n'est pas pourquoi vous voulez le faire, mais " qu'allez-vous faire avec ça?'. Supposons donc que lors de l'exécution de la variable avec le nom
fruits2
magiquement apparu sur la pile de votre méthode. Maintenant ce qui? Vous avez eu à connaître son nom au moment de la compilation pour en profiter. La réflexion ne sera pas vous aider à accéder aux variables locales.De toute façon, je serais intéressé si vous décrit de façon plus détaillée des cas d'utilisation.
Je suis entièrement d'accord avec vous. Java, cependant, n'est pas un langage dynamique et aussi longtemps que notre discussion est limitée à l'étendue de Java (comme la question est de savoir) que nous avons à traiter avec elle. Je serais sûrement avoir trouvé la bonne utilisation de javascript comme
eval
en Java, mais c'est (malheureusement) pas présent.OriginalL'auteur Alex Gitelman
La façon dont vous avez formulé votre question, les gens ne comprendront pas ce que vous demandez. Je crois (si je me FAIS comprendre) la réponse à votre question (qui devrait être formulée: "est-il possible de créer dynamiquement des variables au moment de l'exécution") "n'est pas, comme vous l'avez présenté".
Vous avez raison, il n'y a rien d'analogue à du javascript (très puissant, mais lent et périlleux "eval", une fonction en Java), et c'est précisément ce que vous devez obtenir cela pour faire ce que vous êtes l'espoir de faire.
Le plus proche de ce qui existe est une hashmap (qui est en fait assez proche) où vous pouvez désigner la clé au moment de l'exécution, puis définissez la valeur. Il est assez polyvalent que vous pouvez avoir une carte qui permettra, quel que soit le type que vous voulez stockée dans le champ.
OriginalL'auteur Genia S.
Vous n'allez pas être en mesure de modifier une classe qui a déjà été chargé dans la JVM. Cependant, vous pourrait théoriquement utiliser ASM < http://asm.ow2.org/ > ou BCEL < http://commons.apache.org/bcel/> pour générer dynamiquement une nouvelle classe qui a la dynamique des champs définis par l'.
Façon plus d'ennuis que cela vaut la peine. Sérieusement, il suffit d'utiliser une HashMap!
OriginalL'auteur avh
Serait Janino être utile pour vous?
Voici un peu de code. Je pense que c'est proche de ce que vous voulez, mais je ne suis pas sûr.
}
OriginalL'auteur billybyte
Pouvez-vous peut-être des précisions, pas sûr de ce que vous êtes en train de faire de différent ici. Bien sûr, vous pouvez créer trois différentes chaînes. Toutefois, je crois que la syntaxe de java est une chaîne xx = new string("DDFD");
Edit:
Par cela, je veux dire, ce que vous essayez de changer ici. Vous pouvez allouer de la mémoire dynamiquement, par conséquent, vous pouvez créer des "variables" de façon dynamique. CEPENDANT vous ne pouvez pas créer une "variable" dans la primitive de la mode tels que "int x = 0;" au moment de l'exécution, cependant, vous pouvez ajouter des nœuds à des listes liées, redimensionner des tableaux, etc lors de l'exécution.
Je crois que j'ai une faible idée, je crois que quelqu'un touché sur "octet injection" pas sûr si c'est ce que je suis en train de réfléchir parce que j'ai la plus petite idée de ce. mais si vous pouvez trouver l'adresse de mémoire dans votre mémoire hachage et de la pile de la mémoire vous pouvez directement en corrélation les noms de variables par sortir des limites sur les paramètres etc. Si j'ai très peu de connaissances à ce sujet, c'est comme le concept de débordement de la mémoire tampon de piratage. Je PENSE que c'est peut-être une direction que vous voulez regarder?
OriginalL'auteur oorosco