通过String获取类

时间:2013-07-04 21:52:31

标签: java class object reflection invoke

我正在尝试通过String获取类,并通过String数组获取类的路径:

public void getClass(String name, String[] className){
        try {
            Class current=Game.class;
            if(className!=null)
            for(int i2=0;i2<className.length;i2++){
                for(int i=0;i<current.getClasses().length;i++){
                        if(className[i2].equals(current.getClasses()[i].getSimpleName())){
                            current=current.getClasses()[i];
                            System.out.println(current.getSimpleName());
                            break;
                        }
                }
            }
            Field f=current.getDeclaredField(name.trim());
            f.setAccessible(true);
            return f.get(current);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

但是当我尝试使用参数名称运行它时:“health”和className:{“player”}它应该可以工作,因为类Game包含类“player”而玩家包含整数“health”。相反,我收到此错误消息:

java.lang.IllegalArgumentException: Can not set int field Game.Game$Player.health to java.lang.Class
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.getInt(Unknown Source)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.get(Unknown Source)
at java.lang.reflect.Field.get(Unknown Source)
at Game.Game$Enemy.callVariable(Game.java:1384)
at Game.Game$Enemy.callMethods(Game.java:1357)
at Game.Game$Enemy.update(Game.java:1295)
at Game.Game$EnemyContainer.update(Game.java:1235)
at Game.Game.doFrameInGame(Game.java:563)
at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)

任何帮助都会得到满足。

1 个答案:

答案 0 :(得分:1)

您发布的代码中似乎存在语法错误,因为它是一个void方法,您尝试返回一个值。

根据您的错误日志,我假设您在调用

时尝试返回一个int值
return f.get(current)

但是变量current不是包含字段f的类的实例,而是它是一个类对象,即它是对Game类或在循环中匹配的任何其他类的引用。 / p>

为了让它工作,current应该指向一个具体的对象(例如Game类的实例)