假设我需要生成变量来保存来自用户的一些输入(我不知道它们有多少)。如果没有使用Array
,ArrayList
(以及其他类型的列表和地图),我的代码是否可以生成(可以说)String
变量X次,名称如(String var001
,String var002
,String var003
等)?如果是,请提供示例代码。有没有在Java中动态生成变量的名字?
回答
以下是我实施并帮助我轻松修复我的解决方案,而没有太多障碍的方式。
//创建阵列列表
List accountList = new ArrayList();
for(int k=0;k < counter;k++){
accountList.add(k, (String)flowCtx.getValueAt("transitId"+m));
}
迭代循环和添加的对象与所述索引中的数组列表。
//检索在运行时的对象与索引
String a = accountList.get(i));
你的意思是你想生成一个名为
var0,VAR1,VAR2变量,在代码中使用它们。
的区别是什么,当你使用 变种[0],VAR [1],VAR [2],......
但
可以动态地生成一个Java类在运行时实现您在普通代码中使用的接口。然后你使用编译器(例如Janino)编译这个类,然后在运行时加载这个类。比你动态创建一个类。
但我不知道,这是否有必要为你的用例。
编辑
我现在不为其USECASE你使用这个参数,而是动态的变量,你可以在Java中使用这样example from here
这是不可能的,但是这是一个完美的使用其中一个Java集合的候选人。
要么使用动态分配的数组:
String[] arr = new String[RUNTIME_SIZE];
或列表,可以在运行时改变它的大小:像
List list = new ArrayList<String>();
命名变量看起来很1980年十岁上下。含义是面向对象的编程。因此,如果你曾经为生存建立软件 - 不要这样做。
但因为它似乎是功课...
当我们谈论Java中的一个命名的变量,我们的意思东西是编译。与某些脚本语言不同,在Java中没有简单的方法。
因此,无论你使用像马库斯Lausberg运行时编译的类建议。
或者您作弊并使用Java Scripting API并使用脚本语言。这样你可以在运行时创建代码(以字符串形式)。
我想你可以在运行时生成一个Java类,或者使用一些脚本引擎如Beanshell来生成变量,甚至可以通过它的字节码构建类。但是我不明白你将如何在你的代码中使用这些变量,你还必须创建代码来处理这些变量,或者使用反射来实现...
一个天真的解决方案:
创建与var000所有变量一类var999为每个吸气......但是这并不是真正动态!
不使用数组,ArrayList的(和 其他类型的列表和地图)
创建具有这些名称的文件。希望这会对你的教授有用。
或之前提到使用Java脚本API:
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"
编辑
好像在内部,这将使用地图:)同样的,属性文件,首选项API,或DOM树(它们是使用矢量)。所以,如果你的教授如此挑剔,使用文件。
我还没有看到这个答案,所以我会去的。编写一个只写出Java源代码的程序。它大部分可以是一个模板,你只需要一个循环,可以根据需要编写尽可能多的“字符串UserString003”类型的变量。
是的,这太可怕了。但是,正如你所说,这是一个概念性的家庭作业挑战问题,所以只要没有人错误地认为“好”的代码,它可能会解决问题。
如果你真的想要做这样的事情,你可以通过使用ASM或其他一些库的字节码生成。
以下代码将生成一个名为“foo.bar.ClassWithFields”的类,其中包含字段“var0”到“var99”。当然,除了反射之外,没有办法访问这些字段,因为它们在编译时不存在,Java是一种静态类型的语言。
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);
}
}
}
它看起来像你的教授是PHP偏置的功能(Variable variables),所以他在想,如果在Java中是可能的。
我个人认为这是不可能的,而不是你提出的方式。可以做的是在运行时生成类,使用如Javassist这样的工具来创建更强大的反射机制。所以你可以在运行时创建一个具有你想要的变量(string1,string2等)的类。
但是,不要忘记Variable variables是一个非常糟糕的技术,这会导致错误的代码。这在很少的情况下可能是有用的,但我真的不推荐它。
- 1. Jquery Json动态变量名称生成
- 2. 在没有动态SQL的表名中使用变量SQL
- 3. 动态变量名的Java
- 4. 在PHP中动态形成变量名?
- 5. 没有GD的动态图生成
- 6. 没有定义结构成员变量 - 没有成员命名
- 7. 在java中生成具有正态分布的向量
- 8. 有没有可能在Ruby中做动态变量?
- 9. 动态变量@ *没有发现INC
- 10. 动态生成变量的访问值
- 11. 有没有办法在Android Studio中为java文件提取自动生成的资源名称的字符串?
- 12. jquery:对话框没有在动态生成的表中弹出
- 13. 动态生成java源代码(没有xjc)
- 14. 动态生成的字段没有保存
- 15. _id没有在Elasticsearch中自动生成
- 16. 动态生成在Java
- 17. 在Java中使用带有线程的动态变量
- 18. java/oops中的静态变量和动态变量有什么区别?
- 19. 有没有办法在Java中生成文件名的8.3或'short'(Windows)版本?
- 20. 有没有办法在Firebird中引用带有变量的字段名称
- 21. 在动态生成的字段中添加组字段名称
- 22. 可能生成一个动态变量?
- 23. 在javascript中生成变量名称
- 24. 如何在AS3中生成变量名?
- 25. 在循环中生成变量名称
- 26. T4MVC没有生成动作
- 27. 如何在动作脚本2.0中动态生成变量
- 28. 动态变量名在EL
- 29. 在Java中生成gamma和正态分布?有没有人做过这个?
- 30. 在Visual Studio中,有没有办法自动生成唯一的方法名称?
这是一个非常奇怪的请求帮助...你什么意思 - “不知道有多少”?你什么时候知道?在运行时?无论如何,这看起来像一个集合课的工作。你为什么不能使用它们?你能告诉我们更多关于你的问题吗? – 2009-07-28 08:02:34
我知道这是一个奇怪的要求,但这是我们教授提出的具有挑战性的问题。所以我更关心可能性,不管它的可用性如何。 我的小组发现的唯一技巧就是“Markus Lausberg”已经就这个问题提出了建议......所以还有其他方法吗? – 2009-07-28 08:37:26
我希望你的教授不要读堆栈溢出!他/她的名字是什么? – 2009-07-28 08:50:52