2014-10-27 38 views
2

我看的org.apache.maven.plugin.Mojo定義:在什麼情況下執行Java接口定義中的語句?

public interface Mojo 
{ 
    String ROLE = Mojo.class.getName(); 
    [...] 
} 

我迷路了。據我所知,Java接口是一組方法簽名。那麼這條線看起來像是在這裏做什麼?什麼是語義?例如:

  • 該行何時「執行」?
  • 在該行運行的上下文中,Mojo引用了什麼?它的類型是什麼?
  • 在該行運行的上下文中,Mojo.class指的是什麼?我認爲它的類型是java.lang.Class
  • 在什麼情況下我可以讀取ROLE變量?這樣做的語法是什麼?變量包含什麼?
  • 我可以寫信給那個ROLE變量嗎?
+0

'Mojo'是'Mojo','.class'被記錄在案,'Mojo.ROLE' – 2014-10-27 17:05:02

回答

3

所有接口的領域是隱含的公共,靜態和決賽。因此,這是一樣的書寫

public static final String ROLE = Mojo.class.getName(); 

它定義了一個常量,該接口的所有用戶都可以使用,任何其他不變:Mojo.ROLE。當Mojo接口被ClassLoader初始化時,這條線被執行。 Mojo.class是Mojo類,的確是類型java.lang.Class<Mojo>。由於該類的包是org.apache.maven.plugin,常量的值將是"org.apache.maven.plugin.Mojo"

查看here瞭解Java語言規範的相關部分。

+0

感謝。所以這行相當於編寫'public static final String ROLE =「org.apache.maven.plugin.Mojo」;'?看起來像一些非常毫無意義的使用瘋狂的元編程... – jameshfisher 2014-10-27 17:24:23

+1

這並不毫無意義。如果這個常量應該始終是Mojo類的名稱,那麼它更短,更清晰,並且允許重構類(更改其名稱或包),而不用擔心忘記更改常量的值。你現在還不習慣語法,但是會來的。 – 2014-10-27 17:27:43

+0

我會說編譯時預處理會更適合這樣的問題,而不是運行時執行,但我會推遲。感謝您的回答。 – jameshfisher 2014-10-27 17:41:48

0

變量在類加載器加載類時被定義。接口變量是靜態最終的,並且可以由實現接口的任何類靜態訪問。

public class MyClass implements Mojo{ 
    . 
    . 
    . 
} 

訪問:

public void someMethod(){ 
    System.out.println(MyClass.ROLE) 
} 
0

接口中的所有字段都是隱式靜態和最終的。這回答了您的一些問題:

  • 該行在靜態執行過程中被執行。這可能是在編譯期間,可能是在啓動程序時以及可能在類加載器加載該類時。這是一項複雜的業務,但與所有其他靜態字段相同。
  • Mojo靜態指向接口本身。它本身就是一種類型,所以它沒有類型。
  • Mojo.class指的是Mojo的java.lang.Class
  • 您可以閱讀Mojo的任何類的ROLE變量。您只能靜態讀取它,如Mojo.ROLE
  • 不,這個字段是最終的,所以你不能寫信給它。它僅用於常量。
0
  • 什麼時候該行獲得 「執行」?

一個Interface的任何成員是staticfinal通過默認的,所以String ROLE(其可以用途不同被看作是

public static final String ROLE 

時類加載器加載將被初始化,因爲每個靜態成員,班(第一次參考班級)

JLS - Loading of Classes and Interfaces


  • 在其中該線運行的背景下,是什麼魔指什麼?它的類型是什麼?
  • 在該行運行的上下文中,Mojo.class指的是什麼?我認爲它的類型是java.lang.Class?

魔的類型是java.lang.Class<Mojo>


  • 在我什麼情況下可以讀取該角色的變量?這樣做的語法是什麼?變量包含什麼?

因爲它是隱含public static final你可以從任何地方使用Mojo.ROLE或通過實現類由ClassName.ROLE訪問它。作爲Class#getName()說,在Java文檔,它包含對象的全限定名:

org.apache.maven.plugin.Mojo 

  • 我可以寫信給該角色的變量?

不,你不能,因爲它是隱含final

JLS - Interfaces

相關問題