Generuję klasę dynamiczną w moim programie java, pisząc cały mój kod do pliku java, kompilując plik java do pliku klasy, a następnie ładując plik klasy za pomocą obiektu URLClassLoader. Problem polega na tym, że tworzy on wiele plików na moim komputerze. Czy jest to sposób, aby to zrobić, tworząc tylko "pliki wirtualne" (obiekty plików) i nie generując żadnych rzeczywistych plików, ponieważ sposób w jaki to robię wymaga czasu i wydaje się nieczysty i nieefektywny.Generowanie klasy Dynamic Java
Odpowiedz
Jeśli spojrzysz na klasę ClassLoader, ma ona metodę definiowania klasy z rzeczywistej serii bajtów.
muszę przyznać, że nie współpracował z ładowarki klasy na tej niskiego poziomu, ale mój zrozumienia jest to, że jest to wzór szablonu, gdzie klasa bazowa ClassLoader wie, jak utworzyć klasę w VM oparty na kodzie bajtowym. Klasy potomne są odpowiedzialne za ustalenie, gdzie znaleźć kod bajtu dla danej klasy.
Rozwiązaniem dla Ciebie może być całkowite zaprzestanie używania narzędzia URLClassLoader i samodzielne rozszerzanie ClassLoadera.
, który wydaje się nieco skomplikowany –
Ładowarki klas zwykle są ... – Brandon
A (więcej) rozwiązanie proste byłoby wykonać następujące czynności:
- skompilować plików klas do wspólnego katalogu
- Tworzenie niestandardowego
ClassLoader
który rozciągaClassLoader
- Użyj tego
ClassLoader
czytać w pliki .class.
Oto coś, od czego zaczniesz - zostawiam ćwiczenie polegające na pobraniu kodu bajtowego do obiektu jako ćwiczenie dla czytelnika. (To nie jest bardzo trudne, jeśli użyć nieco SimpleFileVisitor
pracy w tym 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.
}
}
Następnie można go używać tak:
CustomClassLoader loader = new CustomClassLoader();
Class clazz = loader.findClass("com.stackoverflow.some.binary.name");
... pod warunkiem, że nie zrobił” t wyrzuć wyjątek lub wróć null.
to co robię to problem to, że nie chcę tworzyć żadnych plików fizycznych –
...ale wspominałeś, że gdzieś tam kompilujesz, prawda? To nie jest wielki problem, jeśli masz mnóstwo plików .class; można je bezpiecznie usunąć po skończeniu ... – Makoto
Wiem, że to po prostu nie wygląda na czyste –
Biblioteki generowania i manipulacji kodu bajtowego umożliwiają modyfikowanie i generowanie zajęć w locie, w pamięci. Javassist jest prawdopodobnie najłatwiejszy, ponieważ pozwala na użycie składni Java.
Mają również tendencję do bycia lżejszą niż całe autonomiczne kompilatory.
- 1. Generowanie WSDL z klasy java \ źródło
- 2. Programowe generowanie metod klasy
- 3. Generowanie klasy Java z pliku XML przy użyciu XStream
- 4. Dynamic markup in Wicket
- 5. Zestaw narzędzi Java ME Dynamic UI
- 6. Generowanie wizualizację drzewa w java
- 7. Generowanie zrzutów sterty Java JRE7
- 8. Generowanie schematu Avro z określonego obiektu Java
- 9. JAX-WS dynamic webservice url
- 10. Dynamic Arrays
- 11. PHP Microsoft Excel generowanie/eksportowanie klasy klasa
- 12. Kotlin - generowanie toString() dla klasy non-danych
- 13. Generowanie raportu Jaspera z podraportem z java
- 14. Generowanie bardzo dużych liczb losowych java
- 15. Generowanie zrzutu wątku Java bez ponownego uruchamiania.
- 16. Java Logging API generowanie pustych plików dziennika
- 17. Generowanie java z IDL (unikanie pakietu domyślnego)
- 18. Java MongoTemplate: Upserts Not Generowanie ObjectId
- 19. Ścieżka klasy Java - Linux
- 20. jak znaleźć klasy Java?
- 21. Java - tworzenie ścieżki klasy
- 22. Klasy częściowe java
- 23. Ładowanie klasy Java
- 24. Pakiety i klasy Java
- 25. Chętne ładowanie klasy java
- 26. Eclipse: Szablony klasy Java
- 27. Android Adverse To Dynamic Languages
- 28. Android dynamic String Resources
- 29. Dynamic Resource Loading Android
- 30. Serializacja XML Dynamic Ignore
http://docs.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html? – Affe
ale nadal nie muszę tworzyć pliku .java, aby można go skompilować –
zobacz przykład JavaSourceFromString dla możliwego rozwiązania w linku @Affe. – Pyranja