Sto generando una classe dinamica nel mio programma java scrivendo tutto il mio codice in un file java, compilando il file java in un file di classe e quindi caricando il file di classe con un URLClassLoader. Il problema con questo è che crea molti file sul mio computer. È un modo per farlo solo creando "file virtuali" (oggetti file) e non generando alcun file effettivo, perché il modo in cui lo fa richiede tempo e sembra impuro e inefficiente.Generazione di Dynamic Class Java
risposta
Se si guarda alla classe ClassLoader, ha un metodo per definire una classe dalla serie effettiva di byte.
Ammetto che non ho lavorato con caricatori di classe su questo basso livello, ma la mia comprensione è che questo è un modello di template, in cui la classe base ClassLoader sa come creare una classe nel VM basato su codice byte grezzo. Le classi figlie sono responsabili di capire dove trovare il codice byte per una determinata classe.
Quindi la soluzione per voi potrebbe essere quella di smettere di usare completamente URLClassLoader ed estendere ClassLoader da soli.
che sembra un po 'complicato –
I caricatori di classe di solito sono ... – Brandon
A (più) soluzione semplice sarebbe quella di effettuare le seguenti operazioni:
- compilare il file di classe in una directory comune
- Creare un costume
ClassLoader
che si estendeClassLoader
- Utilizzare questa
ClassLoader
da leggere in i file .class.
Ecco qualcosa per iniziare - Lascerò l'esercizio di ottenere il codice byte nell'oggetto come un esercizio per il lettore. (Non è molto difficile, se si utilizza un po 'di lavoro in questo SimpleFileVisitor
Check out Java.NIO..)
public class CustomClassLoader extends ClassLoader {
@Override
public Class findClass(String binaryClassName) {
byte[] b = customLoadClassData(binaryClassName);
return defineClass(binaryClassName, b, 0, b.length);
}
private byte[] customLoadClassData(String binaryClassName) {
// Be sure to read in the specific .class file you want.
// A tip is to handle this *outside* of this class.
}
}
è possibile utilizzare in questo modo:
CustomClassLoader loader = new CustomClassLoader();
Class clazz = loader.findClass("com.stackoverflow.some.binary.name");
... a condizione che esso didn' t lanciare un'eccezione o tornare nulla.
questo è quello che sto facendo il problema è che non voglio creare alcun file fisico –
...ma hai detto che stavi compilando la classe da qualche parte, giusto? Non è un problema enorme se hai un sacco di file .class; quelli possono essere rimossi in modo sicuro dopo aver finito ... – Makoto
so che non sembra pulito –
Le librerie di generazione e manipolazione di codice byte consentono di modificare e generare classi al volo, in memoria. Javassist è probabilmente il modo più semplice per iniziare poiché consente di utilizzare la sintassi Java.
Inoltre tendono ad essere più leggeri di interi compilatori standalone.
- 1. Generazione Class Diagram
- 2. Generazione .class programma per JVM
- 3. Java Dynamic Factory
- 4. Java in Eclipse: generazione automatica del file .class
- 5. Dynamic Clock in java
- 6. Eager java class loading
- 7. java static class/variables
- 8. differenza tra java bean e java class?
- 9. Generazione codice Java
- 10. Java Utility Class vs. Service
- 11. Deadlock Java in Class Loader
- 12. Object [] per Class [] in Java
- 13. Serializzazione Java per Extended Class
- 14. Java Abstract Class And Generics
- 15. Blocco sincronizzato Java per .class
- 16. Estensione di Java Class con Scala Trait
- 17. Significato di .questo e .class in java
- 18. Generazione di Dynamic Regex per pattern di stringhe ripetibili prevedibili in un feed di dati
- 19. Generazione di meta tag di Facebook Open Dynamic in modo dinamico
- 20. Generazione Mucchio dump Java JRE7
- 21. Come eseguire il file .class Java da un altro file .class? (java newb)
- 22. Generazione di XML tramite SAX e Java
- 23. Generazione di parole casuali in Java?
- 24. Generazione di una visualizzazione albero in java
- 25. Generazione di colori del rumore in Java
- 26. Generazione di numeri casuali molto grandi java
- 27. Generazione di X509Certificate con BouncyCastle con Java
- 28. Errore di compilazione Dynamic + linq
- 29. Dynamic Audio Generation Actionscript 3
- 30. Java: javap ERRORE: Impossibile trovare .class
http://docs.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html? – Affe
ma non ho ancora bisogno di creare il file .java in modo che io possa compilarlo –
vedere l'esempio JavaSourceFromString per una possibile soluzione nel link di @Affe. – Pyranja