Java反射 - 通过类名字符串获取级别

Lum*_*mis 1 java reflection android

我一直在研究Java反思.这是来自维基百科http://en.wikipedia.org/wiki/Reflection_(computer_programming)的示例:

// Without reflection
new Foo().hello();

// With reflection
Class<?> cls = Class.forName("Foo");
cls.getMethod("hello").invoke(cls.newInstance());
Run Code Online (Sandbox Code Playgroud)

我发现这有点违反直觉,因为在创建实例之前调用该方法.

反射当然可以用来调用游戏等级,特别是如果有数百个.

编辑 - 一些解决方案:

这是一个适用于Android的反射的简单示例:

    try {                
        Class<?> clazz = Class.forName("com.test.Foo");                
        clazz.newInstance();            
    } catch (Exception e) {                
        throw new IllegalStateException(e);            
    }
Run Code Online (Sandbox Code Playgroud)

和类文件

public class Foo {

    Foo(){  
        hello();    
    }

    private void hello() {  
        Log.e("FOO", "Hello!");
    }
}
Run Code Online (Sandbox Code Playgroud)

假设有人想通过反射来调用Activity:

Activity activity;
try {                
  Class<?> clazz = Class.forName("com.test.MyLevelActivity");                
  activity = (Activity) clazz.newInstance();            
} catch (Exception e) {                
  throw new IllegalStateException(e);            
}
startActivity(new Intent(this,activity.getClass()));
Run Code Online (Sandbox Code Playgroud)

假设一个包含数据和方法的级别应该通过反射"加载":

    Level currentLevel;
    try {                
        Class<?> clazz = Class.forName("com.test.Level_1_1");                
        currentLevel = (Level) clazz.newInstance();            
    } catch (Exception e) {                
        throw new IllegalStateException(e);            
    }

    String levelName = currentLevel.getLevelName();
    String result = Integer.toString(currentLevel.processData(3, 7));

    Toast.makeText(this, levelName + " result= " + result, Toast.LENGTH_LONG).show();
Run Code Online (Sandbox Code Playgroud)

以下是课程:

public abstract class Level {

   public abstract String getLevelName();

   public abstract int processData(int a, int b);

}


public class Level_1_1 extends Level{
   private String levelName = "level 1.1";

   public String getLevelName(){
      return levelName;
   }

   public int processData(int a, int b) {
      return a * b;
  }
} 
Run Code Online (Sandbox Code Playgroud)

San*_*rma 7

我发现这有点违反直觉,因为在创建实例之前调用该方法

对不起,不要这么认为.方法参数在传递给"invoke"之前首先被计算,因此您最终将Foo类的"new"实例传递给Method类的"invoke"方法.另外,如果你想知道为什么在方法对象上调用"invoke",那是因为对于给定的类,你Method只创建一次对象,所有后续的调用都宁可依赖于对象的"状态"而不是"方法"被调用.