Javacompiler من JDK 1.6: كيف تكتب بايت فئة مباشرة إلى صفيف البايت []؟

StackOverflow https://stackoverflow.com/questions/2130039

سؤال

لذلك علمت مؤخرًا من الجديد Javacompiler API متوفر في JDK 1.6. هذا يجعل من السهل جدا تجميع أ String إلى .class الملف مباشرة من تشغيل الرمز:

String className = "Foo";
String sourceCode = "...";

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

List<JavaSourceFromString> unitsToCompile = new ArrayList<JavaSourceFromString>() 
    {{ 
         add(new JavaSourceFromString(className, sourceCode)); 
    }};

StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
compiler.getTask(null, fileManager, null, null, null, unitsToCompile).call();
fileManager.close();    

ByteArrayOutputStream bos = new ByteArrayOutputStream();
FileInputStream fis = new FileInputStream(className + ".class");
IOUtils.copyStream(fis, bos);

return bos.toByteArray();

يمكنك الحصول على المصدر إلى JavaSourceFromString من جافادوك.

هذا سوف يجمع بسهولة جدا sourceCode ل Foo.class في دليل العمل الحالي.

سؤالي هو: هل من الممكن التجميع مباشرة إلى أ byte[] صفيف ، وتجنب فوضى التعامل معها File أنا/س تماما؟

هل كانت مفيدة؟

المحلول

ربما يمكنك إنشاء خاص بك javax.tools.JavaFileManager تنفيذ الفصل حيث ستعيد تنفيذك الخاص javax.tools.FileObject والتي من شأنها أن يكتبها إلى الذاكرة بدلاً من ذلك على القرص. لذلك من أجل الفئة الفرعية الخاصة بك من javax.tools.FileObject Writer openWriter() throws IOException الطريقة التي سترجعها java.io.StringWriter. يجب تحويل جميع الطرق إلى String نظرائه.

نصائح أخرى

السبب في عدم وجود واجهة برمجة تطبيقات قياسية لكتابة bytecodes إلى مجموعة بايت هو أن تجميع ملف مصدر Java واحد قد يؤدي إلى ملفات Bytecode متعددة. على سبيل المثال ، سيؤدي أي ملف مصدر مع فئات متداخلة / داخلية / مجهول أن يؤدي إلى ملفات Bytecode متعددة.

إذا قمت بتشغيل JavafileManager الخاص بك ، فستحتاج إلى التعامل مع هذا الموقف.

كان للتطبيق التجريبي الذي تم شحنه مع JSR 199 API مثالًا على الترجمة من الذاكرة (والذي يستخدم بالفعل أ MemoryFileManager). ربما إلقاء نظرة عليها هنا أو هنا (هذه العينات عفا عليها الزمن بعض الشيء ، سوف تتطلب تغييرات طفيفة). أيضا ربما تحقق كيف تتجمع على الطيران؟ مقال عن java.net.

ملاحظة: لم أنظر إلى جميع التفاصيل ، لكنني لا أعتقد أنه يتعامل مع الحالات المذكورة بواسطة ستيفن ج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top