我看了一下文档,java中的反射能解决一个类中属性的类型以及名字问题。如果要获取的对象是像我刚才提到的形参(可能是基本数值String、int、short、boolean啥的,也可能是Vector、JList对象),比如方法1这样声明:
private void swapData(Vector v1,Vector v2)
{
...
}
以及以下这些情况:
private void compare(String s1,String s2)
{
...
}
private void compare(int src,int target)
{
...
}
private void compare(InputData data1,InputData data2)
{
...
}
我怎么才能获得传入的形参的名称(就是v1、v2、s1、s2、src、target、data1、data2这些东西)和类型呢?(Vector、String、int、InputData)
14 个解决方案
#1
判断对象类型
public static void main(String args[]) {
//String var = "123";
int var = -120;
//TODO:判断数据类型
Object param = var;
if (param instanceof Integer) {
int value = ((Integer) param).intValue();
System.out.println("var ls Integer!");
System.out.println("var ls value ==" + value);
} else if (param instanceof String) {
String s = (String) param;
System.out.println("var ls String!");
System.out.println("var ls value ==" + s);
} else if (param instanceof Double) {
double d = ((Double) param).doubleValue();
System.out.println("var ls double!");
System.out.println("var ls value ==" + d);
} else if (param instanceof Float) {
float f = ((Float) param).floatValue();
System.out.println("var ls float!");
System.out.println("var ls value ==" + f);
} else if (param instanceof Long) {
long l = ((Long) param).longValue();
System.out.println("var ls long!");
System.out.println("var ls value ==" + l);
} else if (param instanceof Boolean) {
boolean b = ((Boolean) param).booleanValue();
System.out.println("var ls boolean!");
System.out.println("var ls value ==" + b);
} else if (param instanceof Date) {
Date d = (Date) param;
System.out.println("var ls Date!");
System.out.println("var ls value ==" + d);
}
//以上代码为获得Object的类型
}
public static void main(String args[]) {
//String var = "123";
int var = -120;
//TODO:判断数据类型
Object param = var;
if (param instanceof Integer) {
int value = ((Integer) param).intValue();
System.out.println("var ls Integer!");
System.out.println("var ls value ==" + value);
} else if (param instanceof String) {
String s = (String) param;
System.out.println("var ls String!");
System.out.println("var ls value ==" + s);
} else if (param instanceof Double) {
double d = ((Double) param).doubleValue();
System.out.println("var ls double!");
System.out.println("var ls value ==" + d);
} else if (param instanceof Float) {
float f = ((Float) param).floatValue();
System.out.println("var ls float!");
System.out.println("var ls value ==" + f);
} else if (param instanceof Long) {
long l = ((Long) param).longValue();
System.out.println("var ls long!");
System.out.println("var ls value ==" + l);
} else if (param instanceof Boolean) {
boolean b = ((Boolean) param).booleanValue();
System.out.println("var ls boolean!");
System.out.println("var ls value ==" + b);
} else if (param instanceof Date) {
Date d = (Date) param;
System.out.println("var ls Date!");
System.out.println("var ls value ==" + d);
}
//以上代码为获得Object的类型
}
#2
以上代码不是很好使,以前版本的代码就是用的这个,每次的对象如果不同的话,都得手动添加判断,而且没有实例对象名字的获取方法,比如Vector v1,没有获取v1这个对象名字“v1”的方法。期待新的解决方案。
#3
所有就出现了规范这一原则。。
一般写setter方法的时候参数名都是用field名字吧?
一般写setter方法的时候参数名都是用field名字吧?
#4
对于对象的成员是可以用反射来获取其定义时的字面名字,
但是对于方法的参数(局部变量),据我说知java标准API中
没有相应的类。
但是对于方法的参数(局部变量),据我说知java标准API中
没有相应的类。
#5
Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。
查看软件包 java.lang.reflect
查看软件包 java.lang.reflect
#6
路过,帮你顶
#7
帮顶一个!
#8
java.lang.reflect这个方法已经弄了,确实能实现获取方法内部的变量名称,这倒不是大问题。现在不是想要内部变量,是想要局部变量。
#9
别考虑了,局部变量的名字编译后就没有了。
要把局部变量的名字弄到类文件中好像只能通过javac -g 来编译了,但不知道如何读出来。
要把局部变量的名字弄到类文件中好像只能通过javac -g 来编译了,但不知道如何读出来。
#10
可以封装一个对象,该对象中有一个type的字段,你只要维护一个常数列表就可以了。
#11
拿到局部变量的的类型有什么意义呢?出了方法执行块,局部变量就失去意义了!你还真不如把这个变量申明为全局变量的好!
#12
LZ有必要更改下需求,你的需求不合理
#13
说得对,重新让他们改。
#14
楼主啊,我觉得这个做学习还不错,现在我也碰到相同的问题
#1
判断对象类型
public static void main(String args[]) {
//String var = "123";
int var = -120;
//TODO:判断数据类型
Object param = var;
if (param instanceof Integer) {
int value = ((Integer) param).intValue();
System.out.println("var ls Integer!");
System.out.println("var ls value ==" + value);
} else if (param instanceof String) {
String s = (String) param;
System.out.println("var ls String!");
System.out.println("var ls value ==" + s);
} else if (param instanceof Double) {
double d = ((Double) param).doubleValue();
System.out.println("var ls double!");
System.out.println("var ls value ==" + d);
} else if (param instanceof Float) {
float f = ((Float) param).floatValue();
System.out.println("var ls float!");
System.out.println("var ls value ==" + f);
} else if (param instanceof Long) {
long l = ((Long) param).longValue();
System.out.println("var ls long!");
System.out.println("var ls value ==" + l);
} else if (param instanceof Boolean) {
boolean b = ((Boolean) param).booleanValue();
System.out.println("var ls boolean!");
System.out.println("var ls value ==" + b);
} else if (param instanceof Date) {
Date d = (Date) param;
System.out.println("var ls Date!");
System.out.println("var ls value ==" + d);
}
//以上代码为获得Object的类型
}
public static void main(String args[]) {
//String var = "123";
int var = -120;
//TODO:判断数据类型
Object param = var;
if (param instanceof Integer) {
int value = ((Integer) param).intValue();
System.out.println("var ls Integer!");
System.out.println("var ls value ==" + value);
} else if (param instanceof String) {
String s = (String) param;
System.out.println("var ls String!");
System.out.println("var ls value ==" + s);
} else if (param instanceof Double) {
double d = ((Double) param).doubleValue();
System.out.println("var ls double!");
System.out.println("var ls value ==" + d);
} else if (param instanceof Float) {
float f = ((Float) param).floatValue();
System.out.println("var ls float!");
System.out.println("var ls value ==" + f);
} else if (param instanceof Long) {
long l = ((Long) param).longValue();
System.out.println("var ls long!");
System.out.println("var ls value ==" + l);
} else if (param instanceof Boolean) {
boolean b = ((Boolean) param).booleanValue();
System.out.println("var ls boolean!");
System.out.println("var ls value ==" + b);
} else if (param instanceof Date) {
Date d = (Date) param;
System.out.println("var ls Date!");
System.out.println("var ls value ==" + d);
}
//以上代码为获得Object的类型
}
#2
以上代码不是很好使,以前版本的代码就是用的这个,每次的对象如果不同的话,都得手动添加判断,而且没有实例对象名字的获取方法,比如Vector v1,没有获取v1这个对象名字“v1”的方法。期待新的解决方案。
#3
所有就出现了规范这一原则。。
一般写setter方法的时候参数名都是用field名字吧?
一般写setter方法的时候参数名都是用field名字吧?
#4
对于对象的成员是可以用反射来获取其定义时的字面名字,
但是对于方法的参数(局部变量),据我说知java标准API中
没有相应的类。
但是对于方法的参数(局部变量),据我说知java标准API中
没有相应的类。
#5
Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。
查看软件包 java.lang.reflect
查看软件包 java.lang.reflect
#6
路过,帮你顶
#7
帮顶一个!
#8
java.lang.reflect这个方法已经弄了,确实能实现获取方法内部的变量名称,这倒不是大问题。现在不是想要内部变量,是想要局部变量。
#9
别考虑了,局部变量的名字编译后就没有了。
要把局部变量的名字弄到类文件中好像只能通过javac -g 来编译了,但不知道如何读出来。
要把局部变量的名字弄到类文件中好像只能通过javac -g 来编译了,但不知道如何读出来。
#10
可以封装一个对象,该对象中有一个type的字段,你只要维护一个常数列表就可以了。
#11
拿到局部变量的的类型有什么意义呢?出了方法执行块,局部变量就失去意义了!你还真不如把这个变量申明为全局变量的好!
#12
LZ有必要更改下需求,你的需求不合理
#13
说得对,重新让他们改。
#14
楼主啊,我觉得这个做学习还不错,现在我也碰到相同的问题