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