2010-03-24 60 views
0
package reflection; 

import java.io.*; 

import java.lang.reflect.*; 

class class0 
{ 
    public void writeout0() 
    { 
    System.out.println("class0"); 
    } 
} 

class class1 
{ 
    public void writeout1() 
    { 
    System.out.println("class1"); 
    } 
} 

class class2 
{ 
    public void writeout2() 
    { 
    System.out.println("class2"); 
    } 
} 

class class3 

{ 

    public void run() 

    { 

    try 

    {  

     BufferedReader reader= new BufferedReader(new InputStreamReader 

(System.in)); 

      String line=reader.readLine(); 

      Class cls=Class.forName(line); 
       //define method here 



    } 

    catch(Exception ee) 

    { 

    System.out.println("here "+ee); 

    } 


    } 
    public void writeout3() 
    { 
     System.out.println("class3"); 
    } 
} 

class class4 
{ 
    public void writeout4() 
    { 
    System.out.println("class4"); 
    } 
} 

class class5 
{ 
    public void writeout5() 
    { 
    System.out.println("class5"); 
    } 
} 

class class6 
{ 
    public void writeout6() 
    { 
    System.out.println("class6"); 
    } 
} 

class class7 
{ 
    public void writeout7() 
    { 
    System.out.println("class7"); 
    } 
} 

class class8 
{ 
    public void writeout8() 
    { 
    System.out.println("class8"); 
    } 
} 

class class9 
{ 
    public void writeout9() 
    { 
    System.out.println("class9"); 
    } 
} 



class testclass { 

    public static void main(String[] args) { 

     System.out.println("Write class name : "); 

     class3 example=new class3(); 

     example.run(); 
    } 

} 

問題是; 第三課將從控制檯讀取類的名稱作爲字符串。在讀取該類的名稱後,它將自動動態生成該類並調用其寫出方法。如果該類未從輸入中讀取,則不會進行初始化。生成java類並動態調用其方法

但我無法繼續;我需要更多3.class的東西,我該怎麼辦?

+0

我很高興地認識到,只有10個班,他的程序。 – Roman 2010-03-24 21:35:30

+0

這是一個Java反射教程:http://java.sun.com/docs/books/tutorial/reflect/您可能會覺得它很有用。 – BalusC 2010-03-24 21:35:56

+0

你是什麼意思「生成該類」?實例化該類的一個對象? – LB40 2010-03-24 21:36:54

回答

1

您需要通過類加載器動態加載類。一個平凡的方式做,這是使用:

Class.forName(yourClassName); 

獲取類對象,然後newInstance()創建新的實例類的。該特定方法只適用於具有默認構造函數的類。請參閱Class javadoc瞭解更多選項。調用構造函數。

+0

我想他首先使用getMethods檢查方法,然後檢查寫入是否在之後,然後實例化對象..但是我不明白問題 – LB40 2010-03-24 21:45:13

+0

我同意它的解釋 – 2010-03-24 22:05:27

0

爲了動態生成Java類文件,有一個名爲Byte Code Engeneering Library (BCEL)的庫,它將生成的字節代碼指令包裝到類文件中並將其加載到運行時。但是,您將不得不學習一些關於Java虛擬機的內容。

我建議創建一個包含「writeOut」方法的接口。生成的類需要實現這個接口。當你加載這個類時,你不需要(很多)反射來調用這個方法。您需要的唯一反映是創建生成的類的實例。

0

繼續喜歡的東西:

//define method here 

Method writeout = null; 
for(Method m : cls.getDeclaredMethods()) { 
    if(m.getName().startsWith("writeout")) { 
     writeout = m; 
     break; 
    } 
} 
Object o = cls.newInstance(); 
writeout.invoke(o); 

基本上,一旦你找到了類,你必須要找到你要調用並創建類的實例,終於調用上該方法的方法新實例。

要了解更多的(更好的)所有這些概念,你應該閱讀Java教程的主題:The Reflection API

BTW你是不是產生一類這裏,而是實例它動態。

2

到目前爲止,您有一個Class對象。你需要實例化這個類來讓一個對象調用一個方法。一旦獲得了所需的實例,就可以通過調用Class對象上的getMethod(String name,Class ... parameterTypes)來找到所需的方法。如果所有類都具有與「writeout()」方法相同的方法名,那麼這很有幫助,否則您必須弄清楚該方法在類內部命名的內容。這裏是你錯過了撥打電話,以「WriteOut的()」中的代碼:

Method m = cls.getMethod("writeout", null); 
    Object writerInstance = cls.newInstance(); 

    m.invoke(writerInstance, null); 

與你在你的例子有類和方法的命名方案,你可以通過分析類找出方法名名稱和提取號碼。儘管如此,如果所有類都共享方法名稱,這會更容易。

0

當我'添加

在於:

方法WriteOut的= NULL; (m.getName()。startsWith(「writeout」)){ (方法m:cls.getDeclaredMethods()){ writeout = m; 休息; } } Object o = cls.newInstance(); writeout.invoke(o); writeout.invoke(o);

,或者:

方法M = cls.getMethod( 「WriteOut的」,NULL); Object writerInstance = cls.newInstance();

m.invoke(writerInstance,null);

我'走

這裏拋出java.lang.ClassNotFoundException:考試

0

簡單的例子,供大家參考:

Class<?> cls_obj = Class.forName("MyClass.java"); 
Method method = cls_obj.getMethod("show"); 
Object obj = cls_obj.newInstance(); 
method.invoke(obj);