Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java使用字符串和反射初始化对象_Java_Reflection - Fatal编程技术网

Java使用字符串和反射初始化对象

Java使用字符串和反射初始化对象,java,reflection,Java,Reflection,我的程序将序列化一个名为Configuration的类的实例。 首先,从配置txt文件中获取atributes的键值,如: SECONDS=60 NAME=JINGGLE LIFE=true 因此,在序列化之前,我必须获取此键值并将其转换为实例: for(Entry<String, String> entry : attributes.entrySet()) { String key = entry.getKey(); Strin

我的程序将序列化一个名为Configuration的类的实例。 首先,从配置txt文件中获取atributes的键值,如:

SECONDS=60 
NAME=JINGGLE 
LIFE=true
因此,在序列化之前,我必须获取此键值并将其转换为实例:

for(Entry<String, String> entry : attributes.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();

            Field field = c.getDeclaredField(key);
            field.setAccessible(true);

            try {
                        //Get the data type and transform the string to this type
                        Class<?> type = field.getType();
                        Object atribute ;
                        atribute = type.getConstructor(String.class).newInstance(value);


                        field.set(o, atribute);
for(条目:attributes.entrySet()){
String key=entry.getKey();
字符串值=entry.getValue();
字段字段=c.getDeclaredField(键);
字段。setAccessible(true);
试一试{
//获取数据类型并将字符串转换为此类型
类类型=field.getType();
对象心房;
atribute=type.getConstructor(String.class).newInstance(value);
野.集(o,阿曲布他);
例如,这适用于字符串和整数,但不适用于原始值或布尔值。。。
例如,我如何使用反射来实现布尔值,并使用字符串true或false来获取值?或者如何使用基元值int来实现。基元类型不能通过反射使用字段很好地工作,因为基元没有构造函数

如果知道给定字段所需的基元类型,请使用类版本的parse,然后在解析后转换为基元(显式或隐式)

您需要按名称执行此操作,并有一个预期字符串和类型的查找表(或一个if/elseif块来检查输入字符串)。 例如:


您可以使用<代码> .t>类/代码>或<代码>整数>类型> < /Cl>。ameter,传递正确的类实例。要查找使用单个int参数的构造函数,请执行
type.getConstructor(Integer.type)
type.getConstructor(int.class)
No,问题是参数alwais将来自字符串。例如,seconds=“60”.Si在编程上,我想将属性秒数设置为int类型,并将其勇敢度设置为60。那么,我如何将int secons=“60”或bool life=“true”设置为int secons=“60”或bool life=“true”也许我不理解你……问题是如果我不知道什么是“atributes”我正在加载。我的意思是,我希望这个类像一个泛型一样用于不同程序的不同配置文件。所以我永远不知道什么时候我会有一个int或bool参数…所以在这种情况下,解决方案是不太晚使用原语,但你可以做一些类似“java.lang.Integer:property=value”的事情它将包含它的类类型,然后在使用反射创建类实例时读取它。不过,简而言之,如果您不知道所需的类型,则“是”原语将不起作用,除非您将原语限制为单个类型,并且除了字符串之外的所有预期输入都可以转换为该类型。
if (key.toUpperCase().equals("SECONDS"))
{
    int seconds = Integer.parseInt(value);
    //set field value (using an overload with primitives or explicity
}