Динамическое создание классов с использованием Java Reflection, java.lang.ClassNotFoundException - PullRequest
4 голосов
/ 02 апреля 2010

Я хочу использовать отражение в 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());    
          }    
    }    
}

Ответы [ 2 ]

6 голосов
/ 02 апреля 2010

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

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

4 голосов
/ 02 апреля 2010

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

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

...