有一个常量类,如下:
[code="java"]public class Constants {
public static final String AA = "aa";
public static final String BB = "bb";
public static final String CC = "cc";
}[/code]
现在要写一个读取常量的工具类,我实现的写法如下:
[code="java"]import java.lang.reflect.Field;
import Constants;
public class ConstantsUtil {
public static String get(String key){
Constants c=new Constants();
Field[] fields = c.getClass().getDeclaredFields();
for(int i=0;i<fields.length;i++){
String varName = fields[i].getName();
if(varName.equals(key)){
try {
Object o = fields[i].get(c);
return o.toString();
} catch (Exception e){
}
}
}
return null;
}
}[/code]
但是感觉get()方法执行过程中先创建一个Constants的对象似乎很没必要,但是对反射不是很了解,问该怎么修改
[quote]可是如果不new的话,Java代码
Object o = fields[i].get(c);
Object o = fields[i].get(c); 该怎么换一种写法实现一样的功能呢?这里的get()方法需要传一个对象进去啊 [/quote]
一开始直接用getFields 然后get就好
get(object)这个方法如果你field定义是static,正如你写的AA BB CC都是static final,
object就忽略,直接写null
-------------------代码------------------------------
Field[] fields = Constants.class.[color=red]getFields(); [/color]
String o =null;
for(int i=0;i<fields.length;i++){
String varName = fields[i].getName();
if(varName.equals(key)){
try {
[color=red] o = fields[i].get(null).toString();[/color] } catch (Exception e) {
e.printStackTrace();
}
}
}
return o;
}
[code="java"]
import java.lang.reflect.Field;
import Constants;
public class ConstantsUtil {
public static String get(String key){
Field[] fields = Constants.class.getDeclaredFields();
for(int i=0;i<fields.length;i++){
String varName = fields[i].getName();
if(varName.equals(key)){
try {
Object o = fields[i].get(c);
return o.toString();
} catch (Exception e){
}
}
}
return null;
}
}
[/code]
没有必要new,你说的很对。其实有三种方法获得class,下面是具的列子:
[code="java"]
//Use the class literal
Class string=java.lang.String.class;
//Call the forName() static method of java.lang.Class
Class string=Class.forName("java.lang.String");
//Call the getClass() method of an object
Class string="a String object".getClass();
[/code]
[quote]该怎么换一种写法实现一样的功能呢?这里的get()方法需要传一个对象进去啊 [/quote]
[code="java"]Object o = fields[i].get(Constants.class.newInstance()); [/code]获取该对象的实例。希望对你有帮助。 :D