我一直在研究Java反射。這是維基百科http://en.wikipedia.org/wiki/Reflection_(computer_programming爲例):Java反射 - 通過類名稱字符串獲取級別
// Without reflection
new Foo().hello();
// With reflection
Class<?> cls = Class.forName("Foo");
cls.getMethod("hello").invoke(cls.newInstance());
我覺得這有點違反直覺的,因爲該方法是創建一個實例之前調用。
反思當然可以用來稱呼遊戲級別,特別是如果有數百人。
編輯 - 一些解決方案:
這裏是反射的一個簡單的例子,其在Android上工作:
try {
Class<?> clazz = Class.forName("com.test.Foo");
clazz.newInstance();
} catch (Exception e) {
throw new IllegalStateException(e);
}
和類文件
public class Foo {
Foo(){
hello();
}
private void hello() {
Log.e("FOO", "Hello!");
}
}
假設一個要調用的活動通過反思:
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()));
假設包含數據,並通過反射的方法應該是「裝」的水平:
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();
這裏是類:
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;
}
}
您是否試圖編寫您發佈的代碼的第二小節?它有用嗎?它編譯了嗎? – luketorjussen
Class類的方法已經定義好了,它肯定沒有hello()方法。泛型不會改變這種情況。當然,您可以將新實例投射到您的類並調用其方法 - 如下所示: Foo foo =(Foo)cls.newInstance(); foo.hello(); 但是因此你的代碼將取決於Foo類。而使用反射來進行方法調用的想法是避免這種依賴。 –