精華區beta java 關於我們 聯絡資訊
※ 引述《wingwindw (小風)》之銘言: : 如果今天我需要在使用者輸入"ClassName"的時候 : 動態的new出該ClassName的instance : 該怎麼做呢?? : 好像是要用Class.forName("ClassName") : 但是詳細情形要怎麼寫?? : 才會有如同 new ClassName() 的效果出來?(取得instance) 主要參考文件: http://java.sun.com/developer/technicalArticles/ALT/Reflection/ 這種情況選用reflection類別是不錯的, 而要產生new ClassName()的效果 一般常見的問題是, 我們不會只想要呼叫預設建構子 :D 像Sample類別, 你有個建構子, 依需要您要呼叫不同的建構子XD public class Sample{ public Sample(){} public Sample(int a, int b){} public Sample(String s){} } ================================================================= 參閱Class的說明, 您會發現有一個method, getConstructors會傳回一個 Constructor陣列 getConstructors public Constructor[] getConstructors() throws SecurityException 而繼續查詢Constructor類別, 幸運地我們找到了getParameterTypes方法 public Class[] getParameterTypes() 有了這些就足以判斷不同的建構子了(overloading特性) ================================================================= 呼叫參數為String的建構子 import java.lang.reflect.*; public class InvokeSample{ public static void main(String[] args) throws ClassNotFoundException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException { Class sample = Class.forName("Sample"); Constructor[] cons = sample.getConstructors(); for(int i=0;i<cons.length;i++){ Class[] parm=cons[i].getParameterTypes(); if(parm.length ==1 && parm[0].getName().indexOf("String")!=-1){ Sample s = (Sample)cons[i].newInstance(new Object[]{"String"}); } } } } -- 又剪貼了一篇xd -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 163.26.34.20 ※ 編輯: qrtt1 來自: 163.26.34.20 (02/14 10:00) > -------------------------------------------------------------------------- < 發信人: champ.bbs@bbs.sayya.org (網路黑貓), 看板: java 標 題: Re: [問題] 如何動態的載入Class? 發信站: SayYA 資訊站 (Wed Feb 15 12:23:24 2006) 轉信站: ptt!ctu-reader!news.nctu!SayYa ※ 引述《qrtt1.bbs@ptt.cc (thinking in java)》之銘言: > ※ 引述《wingwindw (小風)》之銘言: > : 如果今天我需要在使用者輸入"ClassName"的時候 > : 動態的new出該ClassName的instance > : 該怎麼做呢?? > : 好像是要用Class.forName("ClassName") > : 但是詳細情形要怎麼寫?? > : 才會有如同 new ClassName() 的效果出來?(取得instance) > 主要參考文件: > http://java.sun.com/developer/technicalArticles/ALT/Reflection/ > 這種情況選用reflection類別是不錯的, 而要產生new ClassName()的效果 > 一般常見的問題是, 我們不會只想要呼叫預設建構子 :D Java Programming Dynamics http://www-128.ibm.com/developerworks/java/library/j-dyn0429/ 這是第一篇, 一共有八篇, 其他Link在該篇文章都有 Reflection對於程式效能Overhead相當可觀 文章內有詳細的講述, 也有提供的建議: Javassist & BCEL -- ※ Origin: SayYA 資訊站 <bbs.sayya.org> ◆ From: alumni.csie.nctu.edu.tw