2013-03-14 2 views
16

мыслящего в программе Java выглядит следующим образом:Class.forName() бросает ClassNotFoundException

package typeinfo; 
import static util.Print.*; 

class Candy { 
static { print("Loading Candy"); } 
} 

class Gum { 
static { print("Loading Gum"); } 
} 

class Cookie { 
static { print("Loading Cookie"); } 
} 

public class SweetShop { 
public static void main(String[] args) { 
    print("inside main"); 
    new Candy(); 
    print("After creating Candy"); 
    try { 
    Class.forName("Gum"); 
    } catch(ClassNotFoundException e) { 
    print("Couldn't find Gum"); 
    } 
    print("After Class.forName(\"Gum\")"); 
    new Cookie(); 
    print("After creating Cookie"); 
} 
} 

Я ожидаю выход следующим образом:

/* Output: 
inside main 
Loading Candy 
After creating Candy 
Loading Gum 
After Class.forName("Gum") 
Loading Cookie 
After creating Cookie 
*/ 

Но получить

inside main 
Loading Candy 
After creating Candy 
Couldn't find Gum 
After Class.forName("Gum") 
Loading Cookie 
After creating Cookie 

Очевидно, блок try бросает исключение ClassNotFoundException, что является неожиданным. Любые идеи, почему код генерирует это вместо инициализации класса Gum, как и ожидалось?

ответ

46

Ваши классы находятся в пакете typeinfo, поэтому их полные имена: typeinfo.Gum, typeinfo.Candy и typeinfo.Cookie. Class.forName() принимает только полностью квалифицированные имена:

Параметры:

className - полное имя требуемого класса.

Изменить код:

try { 
    Class.forName("typeinfo.Gum"); 
} catch(ClassNotFoundException e) { 
    print("Couldn't find Gum"); 
} 
+0

Brilliant - очевидно, когда-то указывал. Огромное спасибо! – Terry

+0

Мне это нравится, но чтобы расширить его дальше, есть ли способ итерации через мои программные пакеты, чтобы попытаться найти его без fqn? – JoshuaTree

+0

@ Enjoy87: Насколько я знаю, не в переносном смысле. (Если у вас есть конкретный файл jar или каталог, вы можете посмотреть там, но это другое дело.) –

Смежные вопросы