2017-10-12 30 views
-1

J'essaie de charger la classe en utilisant Class.forName() mais elle me donne l'exception java.lang.ClassNotFoundException: Test.Impossible de trouver la classe chargée dynamique

est créé dans le répertoire de travail Eclipse here is the image mais créé en dehors du dossier bin. Si j'essaie de lancer l'invite de commande, cela fonctionne correctement.

ci-dessous le code:

public class CompileString { 

public static void main(String arges[]) throws Exception{ 

    JavaCompiler compiler=ToolProvider.getSystemJavaCompiler(); 
    String program = " class Test{" + " public static void main (String [] args){" 
       + "  System.out.println (\"Hello, World\");" 
       + "  System.out.println (args.length);" + " }" + "}" 
       +"interface demo{}"   
       ; 

    Iterable<? extends JavaFileObject> fileObjects; 
     fileObjects = getJavaSourceFromString(program); 

     Boolean result=compiler.getTask(null, null, null, null, null, fileObjects).call(); 
     System.out.println(result); 


     Class<?> clazz=null; 
     try { 
      clazz = Class.forName("Test"); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
       System.out.println(clazz); 
      e.printStackTrace(); 

     } 
     Method m = clazz.getMethod("main", new Class[] { String[].class }); 
     Object[] _args = new Object[] { new String[0] }; 
     m.invoke(null, _args); 
     } 

     static Iterable<JavaSourceFromString> getJavaSourceFromString(String code) { 
     final JavaSourceFromString jsfs; 
     jsfs = new JavaSourceFromString("demo", code); 
     return new Iterable<JavaSourceFromString>() { 
      public Iterator<JavaSourceFromString> iterator() { 
      return new Iterator<JavaSourceFromString>() { 
       boolean isNext = true; 

       public boolean hasNext() { 
       return isNext; 
       } 

       public JavaSourceFromString next() { 
       if (!isNext) 
        throw new NoSuchElementException(); 
       isNext = false; 
       return jsfs; 
       } 

       public void remove() { 
       throw new UnsupportedOperationException(); 
       } 
      }; 
      } 
     }; 
     } 

} 

Une autre classe:

class JavaSourceFromString extends SimpleJavaFileObject { 
    final String code; 

    JavaSourceFromString(String name, String code) { 
    super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE); 
    this.code = code; 
    } 

    public CharSequence getCharContent(boolean ignoreEncodingErrors) { 
    return code; 
    } 
} 

il me donne le temps d'exécution Exception

java.lang.ClassNotFoundException: Test

Tout fonctionne correctement compilateur JavaCompiler compiler=ToolProvider.getSystemJavaCompiler() donne true mais pourquoi je ne suis pas en mesure de trouver le Test.class.

+0

Le test de classe n'est pas dans votre classpath – Jens

+0

Jens ..thanx pour votre réponse yest il ne chemin de la classe, mais puis-je résoudre ce problème si –

+0

J'essaie de courir en utilisant l'invite de commande cela fonctionne correctement –

Répondre

1

Pourquoi ce code ne fonctionne pas

Eclipse génère des fichiers de classe dans un répertoire différent de celui où le programme fonctionne, alors que lorsque vous l'exécutez à partir de la ligne de commande que vous utilisez la même valeur.

Comment fixer

La meilleure façon de résoudre ce problème serait d'utiliser un URLClassLoader pour charger les classes, vous pouvez spécifier le répertoire à utiliser pour trouver les fichiers de classe.

Exemple de code (Utilise List.of de Java 9)

import java.io.File; 
import java.io.IOException; 
import java.lang.reflect.*; 
import java.net.MalformedURLException; 
import java.net.URI; 
import java.net.URLClassLoader; 
import java.util.*; 
import java.util.logging.Logger; 
import javax.tools.*; 

public final class CompileString { 

    static class JavaSourceFromString extends SimpleJavaFileObject { 
     private final String code; 

     JavaSourceFromString(final String name, final String code) { 
      super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE); 
      this.code = code; 
     } 

     @Override 
     public CharSequence getCharContent(final boolean ignoreEncodingErrors) { 
      return code; 
     } 
    } 

    private CompileString() {} 

    private static final Logger LOG = Logger.getLogger(CompileString.class.getCanonicalName()); 

    private static final JavaCompiler COMPILER = ToolProvider.getSystemJavaCompiler(); 
    public static void main(final String...args) { 

     final String program = 
      "public class Test{" + 
      " public static void main (String [] args) {" + 
      "  System.out.println (\"Hello, World\");" + 
      "  System.out.println (args.length);" + 
      " }" + 
      "}"; 

     final List <JavaSourceFromString> fileObjects = List.of(new JavaSourceFromString("Test", program)); 

     final boolean result = COMPILER.getTask(null, null, null, null, null, fileObjects).call(); 
     LOG.info("Compilation result was: " + result); 

     final URL url; 
     try { 
      url = new File("./").toURI().toURL(); 
     } catch (final MalformedURLException ex) { 
      throw new AssertionError("Bad URL? (Really shouldn't happen)", ex); 
     } 

     try (URLClassLoader loader = new URLClassLoader(new URL[] {url})) { 
      final Class<?> clazz = loader.loadClass("Test"); 
      final Method main = clazz.getMethod("main", String[].class); 
      final Object[] invocationArguments = {new String[] {}}; 
      main.invoke(null, invocationArguments); 
     } catch (final ClassNotFoundException ex) { 
      throw new AssertionError("Bad class name", ex); 
     } catch (final IOException ex) { 
      throw new AssertionError("IO Error", ex); 
     } catch (final NoSuchMethodException ex) { 
      throw new AssertionError("Missing main method", ex); 
     } catch (final IllegalAccessException ex) { 
      throw new AssertionError("Class or main method not public", ex); 
     } catch (final InvocationTargetException ex) { 
      throw new AssertionError("Exception thrown by main method", ex); 
     } 
    } 

} 
+0

jrtapsell thanx pour la réponse avez-vous un exemple de lien de code afin que je puisse le réparer? –

+0

Juste le nettoyage de mon code d'exemple avant de poster – jrtapsell

+0

jrtapsell ..thanks bro –