Disons que je dois générer des variables pour contenir des entrées de l'utilisateur (je ne sais pas combien ils sont). Sans utiliser code> tableau code>, ArrayList code> (et d'autres types de listes et maps) peut générer mon code (disons)
chaîne code> variables x fois avec des noms comme (
string var001 code>,
string var002 code>,
string var003 code>, etc.)? Si oui, veuillez fournir un exemple de code. P>
10 Réponses :
Vous voulez dire que vous souhaitez générer des variables nommées
Var0, Var1, Var2 et utilisez-les dans votre code. P>
Quelle est la différence lorsque vous utilisez var [0], var [1], var [2], ..... p>
mais fort> p> Vous pouvez générer une classe Java de manière dynamique à Runtime qui implémente une interface que vous utilisez dans votre code normal. Ensuite, vous compilez cette classe à l'aide d'un compilateur (par exemple Janino), puis chargez la classe au moment de l'exécution. Que vous avez créé une classe de manière dynamique. P> mais je me demande, que cela soit nécessaire pour votre usecase. P> I Ne faites pas maintenant pour quelle USecase vous utilisez ces paramètres, mais des arguments dynamiques que vous pouvez utiliser dans Java, comme celui-ci Exemple d'ici P> // calculate average
public static double average( double... numbers )
{
double total = 0.0; // initialize total
// calculate total using the enhanced for statement
for ( double d : numbers )
total += d;
return total / numbers.length;
} // end method average
Ce n'est pas possible, mais il s'agit d'un candidat parfait pour utiliser l'une des collections Java.
Utilisez une matrice allouée dynamiquement: P>
List list = new ArrayList<String>();
Pour le compte rendu possible dans PHP. Voir «Variables Variables» dans le manuel.
Nommer des variables comme ça ressemble à très 1980-ish. Signification Programmation orientée de l'objet. Donc, si vous construisez un logiciel pour gagner sa vie - ne faites pas cela. P>
Mais puisqu'il semble être des devoirs ... p>
Lorsque nous parlons d'une variable nommée en Java, nous entendons quelque chose qui est compilé. Contrairement à certaines langues de script, il n'y a pas de moyen facile de le faire en Java. P>
Ainsi, vous utilisez une classe compilée d'exécution comme Markus Lausberg suggérée.
Ou vous trichez et utilisez le API de script Java < / a> et utiliser les langues de script. De cette façon, vous pouvez créer du code (dans une chaîne) au moment de l'exécution. P>
Java Scripting Api est très intéressant :) Merci pour les nouvelles informations!
Je pense que vous pouvez générer une classe Java à l'exécution ou peut-être utiliser un moteur de script comme Beanshell pour générer Les variables, vous pouvez même construire la classe par son bytecode. Mais je ne vois pas comment vous utiliserez cette variables dans votre code, vous devez également créer le code pour fonctionner avec ces variables ou utiliser la réflexion pour cela ... P>
une solution naïve:
Créez une classe avec toutes les variables de Var000 à Var999 avec un getter pour chacun ... mais ce n'est pas vraiment dynamiquement! em> p>
sans utiliser de matrice, arraylist (et autre type de liste et de cartes) p>
Créer des fichiers avec ces noms. J'espère que cela fonctionnera pour votre professeur. p>
ou utilisez l'API de script Java mentionné précédemment: P>
ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); engine.put("x", "hello"); // you can add any variable here // print global variable "x" engine.eval("println(x);"); // the above line prints "hello"
Je n'ai pas encore vu cela répondu, alors je vais y aller. Écrivez un programme qui vient d'écrire le code source Java. La plupart d'entre elles pourraient être un modèle et vous auriez une boucle qui écrirait autant de variables de type "UserString003 de chaînesTring003" que vous le souhaitez. P>
Oui, c'est horrible. Mais, comme vous l'avez dit, c'est un problème de défi conceptuel pour les devoirs, tant que personne ne cesse ce pour le "bon" code, cela pourrait résoudre le problème. P>
Si vous vraiment em> veux faire quelque chose comme ça, vous pouvez le faire par la génération de bytecode à l'aide de ASM ou une autre bibliothèque. Voici le code qui générera une classe nommée "foo.bar.classwithfields" contenant des champs "Var0" à "Var99". Bien sûr, il n'ya aucun moyen autre que la réflexion pour accéder à ces domaines, car ils n'existent pas à l'heure de la compilation et Java est une langue typée statique. P> import org.objectweb.asm.*;
import static org.objectweb.asm.Opcodes.*;
import java.lang.reflect.Field;
public class GeneratedFieldsExperiment {
public static byte[] generateClassWithFields(int fieldCount) throws Exception {
ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
MethodVisitor mv;
AnnotationVisitor av0;
cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, "foo/bar/ClassWithFields", null, "java/lang/Object", null);
for (int i = 0; i < fieldCount; i++) {
fv = cw.visitField(ACC_PUBLIC, "var" + i, "Ljava/lang/String;", null, null);
fv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
mv.visitInsn(RETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
}
cw.visitEnd();
return cw.toByteArray();
}
public static void main(String[] args) throws Exception {
MyClassLoader loader = new MyClassLoader();
Class<?> c = loader.defineClass("foo.bar.ClassWithFields", generateClassWithFields(100));
System.out.println(c);
System.out.println("Fields:");
for (Field field : c.getFields()) {
System.out.println(field);
}
}
private static class MyClassLoader extends ClassLoader {
public Class<?> defineClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}
}
Il utilise la bibliothèque ASM pour générer une classe - le tableau d'octets est dans le même format que les fichiers .class que le compilateur Java produit - puis le chargent à la JVM à l'aide d'un chargeur de classe personnalisé. ASM fonctionne au niveau de la bytecode Java (similaire au code de montage), afin de comprendre le code ci-dessus, vous devez d'abord apprendre que Java Bytecode (la documentation de l'ASM est bonne pour cela: download.forge.Objectweb.org/asm/asm-guide.pdf ). Certaines autres bibliothèques de manipulation de Bytecode peuvent être plus faciles à utiliser que ASM, car elles sont plus élevées que le bypode pur. Je pense que Javassist est une de ces bibliothèques.
On dirait que votre professeur est php-biaisé sur la fonctionnalité ( Variables variables ), alors il pensait si cela était possible en Java. P>
Je pense personnellement que cela est possible, pas dans la façon dont vous proposez. Ce qui peut être fait est la génération de classes à l'exécution, à l'aide d'outils tels que Javassist pour faire un mécanisme de réflexion plus puissant. Donc, vous pouvez créer une classe qui a les variables que vous souhaitez (string1, string2, etc.) au moment de l'exécution. P>
Cependant, n'oubliez pas que Variables Variables est une très mauvaise technique, ce qui conduit à un mauvais code. Cela pourrait être utile sur très peu de cas, mais je ne le recommande vraiment pas. p>
Voici la méthode que j'ai mise en œuvre et m'a aidé à corriger facilement ma solution sans beaucoup d'obstacles.
// Création de la liste des arraches p>
String a = accountList.get(i));
Qu'est-ce que flowctx ici?
Je ne sais pas si je vous ai bien compris, mais si vous essayez d'utiliser des noms créés de manière dynamique pour vos variables, alors oui, définitivement - je le fais comme ceci: comme vous peut voir la clé de point ici est le signe "$" qui dit essentiellement "Créer un nom de variable de la chaîne donnée après ce signe", et c'est essentiellement cela - fonctionne comme un charme pour moi depuis quelques années ... espère C'est ce que tu voulais et qu'il aide un peu à résoudre votre problème. P> p>
Je ne pense pas que Java Language fonctionne comme vous le pensez. Vous pouvez éliminer la ligne où vous définissez MyDynamiquementCréatedname code> et le code va toujours faire la même chose. Cela crée simplement une variable nommée
$ mydynamicalyycreatedname code>.
Bien, assez étrangement, il fonctionne certainement: une partie de mon code crée des matériaux (comme des couleurs avec des attributs de surface spécifiques - métallique, brillant, verre, etc.), j'ai comme 3 couleurs différentes de matériau spécifique (disons "chrome"), chacun Le matériau doit avoir un nom unique - maintenant j'utilise le même script pour tous les matériaux chromés et chacun de ceux de ceux créés a un nom créé de manière dynamique de la manière dont j'ai décrit ci-dessus ... Dites-moi maintenant ce qui ne va pas comme je le vois travailler quotidiennement ! ;-)
Peut-être que tu n'utilises pas Java? Si des noms créés dynamiquement ont fonctionné de cette façon, vous devriez pouvoir faire cela: String Name = "myvar"; Nom int $ = 1; System.out.println (myvar); code> mais cela ne compilera même pas.
Voir, je ne suis pas Java Guru, alors s'il vous plaît ne me donnez pas cette question de réthorie, je ne sais pas pourquoi ni comment, mais cela fonctionne certainement pour moi - tout ce qui est compilé sans attelage et fonctionne comme un charme, si ce ne serait pas tout nouveau matériel de La même classe (dans ce cas en ce cas chrome) écraserait la précédente qu'elle ne le fait pas: tous ont leurs propres noms uniques ou mieux dit non pas de noms comme .SetName () mais "noms" lorsque vous les initialisez (l'anglais n'est pas ma langue maternelle. , désolé) ... btw je voudrais essayer plutôt system.out.println ($ nom);
Je pense que ce qui se passe est que vous créez une variable nommée $ mydynamicalyycreatedname code>. La valeur de
myDynamicalyCreatedname code> n'est pas pertinente. En fait,
myDynamicalyCreatedName code> n'a même pas besoin d'exister.
Il doit exister iMho parce que vous n'auriez pas ces noms uniques, vous n'auriez que plusieurs noms de "$" - vont de "$ mydynamicalyCreatedName" à "$" n'ont aucune logique ni au moins je n'ai pas obtenu ce que vous voulez dire, Quoi qu'il en soit, cela fonctionne simplement: les noms de var dynamiques sont créés et il n'a pas d'importance pour moi que beaucoup s'ils restent pour «$ nom89» ou uniquement «Nom89», car ce signe «$» n'a aucun effet pour mon code. Une manière ou une autre c'est un nom dynamique - le temps d'aller vous coucher, 01h30 la nuit ici, au revoir.
C'est une demande très étrange ... que voulez-vous dire - "Je ne sais pas combien il y a"? Quand allez-vous savoir? À l'exécution? Quoi qu'il en soit, cela ressemble vraiment à un travail pour une classe de collecte. Pourquoi ne pouvez-vous pas les utiliser? Pourriez-vous nous en dire plus sur votre problème?
Je sais que c'est une demande étrange, mais c'est un problème difficile Notre professeur met en place une table. Je suis donc concerné davantage avec la possibilité de le faire quelle que soit sa convivialité! La seule astuce autour de cela que mon groupe a trouvé ce que "Markus Lausberg" a déjà suggéré de ce problème ... alors y a-t-il d'autres choses?
J'espère que votre professeur n'a pas lu la pile débordement! Quel est son nom?
Lol, ne t'inquiète pas "Rob" ... ça ne me dérange pas de demander de l'aide aussi longtemps que nous créditer la source. (Aucun nom s'il vous plaît :)
Les hashtables sont-elles interdites?
Pas de hashtables! Ce n'est pas permis!
Je pense que votre professeur a signifié la réflexion. Je n'ai jamais utilisé la réflexion Java, mais je regarde à travers l'API, vous ne associez pas d'identifiants aux instances d'objet créées par réflexion en Java. Il doit sûrement y avoir des malentendus ici.
Je n'ai jamais entendu parler de cette API "reflet" auparavant, alors merci pour la nouvelle information "drjokepu". Je vais vérifier et voir.
Demandez à votre professeur s'il t'aimerait que vous programmiez également les yeux bandés - cela fait autant de sens. Des tableaux et des collections existent pour exactement cet objectif. Je ne vois même pas comment vous apprendriez quelque chose d'utile d'un tel exercice.
:) Prenez-le facilement "Michael" ... Je pense qu'il y a une idée derrière cela, peut-être quelque chose comme (bien que vous puissiez utiliser la calculatrice, vous devez savoir multiplier manuellement et diviser manuellement) ... ou qui sait ... le seul Je sais que c'est «c'est un problème et je souhaite la bienvenue à toutes les solutions suggérées. Merci pour votre commentaire!