Динамическое создание класса с использованием Java Reflection, java.lang.ClassNotFoundException

Я хочу использовать отражение в java, я хочу, чтобы третий класс читал имя класса как String из консоли. Прочитав имя класса, он автоматически и динамически (!) сгенерирует этот класс и вызовет его метод writeout. Если этот класс не будет прочитан из ввода, он не будет инициализирован.

Я написал эти коды, но я всегда беру "java.lang.ClassNotFoundException", и я не знаю, как я могу это исправить. Может кто-нибудь мне помочь?

class class3 {  
   public Object dynamicsinif(String className, String fieldName, String value) throws Exception
   {    
      Class cls = Class.forName(className,true,null);    
      Object obj = cls.newInstance();    
      Field fld = cls.getField(fieldName);    
      fld.set(obj, value);    
      return obj;    
  }

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

public class Main {        
    public static void main(String[] args) throws Exception    
    {            
           System.out.println("enter the class name : ");    
       BufferedReader reader= new BufferedReader(new InputStreamReader(System.in));
           String line=reader.readLine();    
           String x="Text1";    
           try{    
              class3 trycls=new class3();    
              Object gelen=trycls.dynamicsinif(line, x, "rubby");    
              Class yeni=(Class)gelen;        
              System.out.println(yeni);                    
          }catch(ClassNotFoundException ex){        
              System.out.print(ex.toString());    
          }    
    }    
}

person rubby    schedule 02.04.2010    source источник
comment
Сделайте отступ в коде с помощью 4 пробелов и удалите пустые строки, чтобы его было легче читать.   -  person Progman    schedule 02.04.2010
comment
Является ли использование символа ı для обозначения I интернационализацией?   -  person matt b    schedule 02.04.2010


Ответы (2)


Java выдаст ClassNotFoundException, когда вы попытаетесь отразить имя класса, а класс с таким именем не может быть расположен в пути к классам. Вы должны убедиться, что класс, который вы пытаетесь создать, находится в пути к классам и что вы используете его полное имя (например: java.lang.String вместо просто String)

РЕДАКТИРОВАТЬ: вам не нужно использовать метод 3 arg forName для Class. Вместо этого используйте 1 аргумент forName, который принимает только имя класса, которое вы передаете.

person akf    schedule 02.04.2010

Распространенной ошибкой при попытке создать экземпляр объекта посредством отражения является передача только имени класса, а не полного имени. Другими словами, использование «String» вместо «java.lang.String» не сработает.

Кроме того, имейте в виду, что ваш код будет работать только для классов, которые имеют конструктор по умолчанию (или без аргументов). Если вы столкнетесь с классом, который требует аргументов в своем конструкторе, ваш вызов «cls.newInstance()» будет блевать.

person Todd R    schedule 02.04.2010