[英]Java reflections - get level by the class name string
我一直在研究Java的思考。 這是來自Wikipedia 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());
我發現這有點違反直覺,因為在創建實例之前調用了該方法。
當然,反思對於召喚游戲級別可能會有用,特別是如果有數百個級別的話。
編輯-某些解決方案:
這是在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;
}
}
我發現這有點違反直覺,因為在創建實例之前調用了該方法
不好意思,別這樣。 方法參數在傳遞給“調用”之前首先進行評估,因此最終將Foo類的“新”實例傳遞給Method類的“調用”方法。 另外,如果您想知道為什么要對方法對象調用“調用”,那是因為對於給定的類,您只能創建一次Method
對象,並且所有后續調用都將取決於對象的“狀態”,而不是對象的“狀態”。 “方法”被調用。
這里
foo.hello();
不能工作,foo只是沒有方法hello()的對象。
陌生的事物似乎違反直覺,但最終新習語成為自然。 只需采用標准方法即可。
要理解它,請考慮方法定義不是對象的一部分,您只需為該類編寫一次方法,它就可以獨立於任何給定對象而“生存”。 因此,全班同學說“嘿,方法,將自己應用到這個對象的上下文中,他是我們的一員”是很合理的。
目前還不清楚您的意思,但這有幫助嗎?
Class<?> cls = Class.forName("Foo");
Method method = cls.getMethod("hello");
Object instance = cls.newInstance();
method.invoke(instance);
您不是先調用該方法。 您只是定義方法然后調用它。 同樣,在實際輸入invoke之前創建了cls的實例。 我發現反射是Java中非常有用的API,幾乎所有在Java上運行的framworks都使用它,例如struts,log4j等。在反射中,您始終定義要調用的方法,然后才在實際對象上工作您想繼續操作。
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.