簡體   English   中英

Java反射-通過類名稱字符串獲取級別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM