Нижний код компилирует входную строку и возвращает результат в виде целого числа. Хотя это работает, я получаю предупреждение Netbeans о том, что строка super.close() в методе close() класса NewOutputStream должна обрабатываться с помощью try-with-resources. . Изменение:
try (super) {
this.linkedHashMap.put(this.string,this.byteArrayOutputStream.toByteArray());
}
не работает. Этот вопрос также может быть связан с суперконструктором «попробуй с ресурсами при вызове», но я не знаю, как адаптировать ответ к моему коду.
Вот мой код :
package group.javacompiler;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import javax.tools.FileObject;
import javax.tools.ForwardingJavaFileManager;
import javax.tools.JavaFileObject;
import javax.tools.JavaFileObject.Kind;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class JavaCompiler {
public static void main(String[] args) {
try {
String input = "1+2";
String returnType = "int";
String methodName = "methodName";
String className = "ClassName";
ArrayList arrayList = new ArrayList();
arrayList.add(new NewCharContent(className+".java",
"public class "+className+" {\n"+
" public static "+returnType+" "+methodName+"() {\n"+
" return "+input+";\n"+
" }\n"+
"}"
));
LinkedHashMap linkedHashMap = new LinkedHashMap();
javax.tools.JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.getTask(null,new NewForwardingJavaFileManager(compiler.getStandardFileManager(null,null,null),linkedHashMap),null,null,null,arrayList).call();
int result = (int) new NewClassLoader(linkedHashMap).findClass(className).getMethod(methodName).invoke(null,new Object[]{});
System.out.println(result);
}
catch (Throwable throwable) {
System.out.println(throwable.getMessage());
}
}
private static class NewCharContent extends SimpleJavaFileObject {
private final String charSequence;
private NewCharContent(String string,String charSequence) {
super(URI.create("string:///"+string),Kind.SOURCE);
this.charSequence = charSequence;
}
@Override
public CharSequence getCharContent(boolean bool) {
return this.charSequence;
}
}
private static class NewForwardingJavaFileManager extends ForwardingJavaFileManager {
private final LinkedHashMap linkedHashMap;
private NewForwardingJavaFileManager(StandardJavaFileManager fileManager,LinkedHashMap linkedHashMap) {
super(fileManager);
this.linkedHashMap = linkedHashMap;
}
@Override
public JavaFileObject getJavaFileForOutput(final Location location,final String string,Kind kind,FileObject fileOject) {
return new NewJavaFileForOutput(string,this.linkedHashMap);
}
}
private static class NewJavaFileForOutput extends SimpleJavaFileObject {
private final String string;
private final LinkedHashMap linkedHashMap;
private NewJavaFileForOutput(String string,LinkedHashMap linkedHashMap) {
super(URI.create("string:///"+string+".class"),Kind.CLASS);
this.string = string;
this.linkedHashMap = linkedHashMap;
}
@Override
public OutputStream openOutputStream() {
return new NewOutputStream(this.string,this.linkedHashMap);
}
}
private static class NewOutputStream extends OutputStream {
private final String string;
private final LinkedHashMap linkedHashMap;
private final ByteArrayOutputStream byteArrayOutputStream;
private NewOutputStream(String string,LinkedHashMap linkedHashMap) {
this.string = string;
this.linkedHashMap = linkedHashMap;
this.byteArrayOutputStream = new ByteArrayOutputStream();
}
@Override
public void write(int intValue) {
this.byteArrayOutputStream.write(intValue);
}
@Override
public void close() throws IOException {
this.linkedHashMap.put(this.string,this.byteArrayOutputStream.toByteArray());
super.close();
}
}
private static class NewClassLoader extends ClassLoader {
private final LinkedHashMap linkedHashMap;
private NewClassLoader(LinkedHashMap linkedHashMap) {
this.linkedHashMap = linkedHashMap;
}
@Override
public Class findClass(String string) {
byte[] byteArray = this.linkedHashMap.get(string);
return defineClass(string,byteArray,0,byteArray.length);
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... tputstream
Предупреждение о попытке с ресурсами для закрытия Super OutputStream ⇐ JAVA
Программисты JAVA общаются здесь
1721867250
Anonymous
Нижний код компилирует входную строку и возвращает результат в виде целого числа. Хотя это работает, я получаю предупреждение Netbeans о том, что строка super.close() в методе close() класса NewOutputStream должна обрабатываться с помощью try-with-resources. . Изменение:
try (super) {
this.linkedHashMap.put(this.string,this.byteArrayOutputStream.toByteArray());
}
не работает. Этот вопрос также может быть связан с суперконструктором «попробуй с ресурсами при вызове», но я не знаю, как адаптировать ответ к моему коду.
Вот мой код :
package group.javacompiler;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import javax.tools.FileObject;
import javax.tools.ForwardingJavaFileManager;
import javax.tools.JavaFileObject;
import javax.tools.JavaFileObject.Kind;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class JavaCompiler {
public static void main(String[] args) {
try {
String input = "1+2";
String returnType = "int";
String methodName = "methodName";
String className = "ClassName";
ArrayList arrayList = new ArrayList();
arrayList.add(new NewCharContent(className+".java",
"public class "+className+" {\n"+
" public static "+returnType+" "+methodName+"() {\n"+
" return "+input+";\n"+
" }\n"+
"}"
));
LinkedHashMap linkedHashMap = new LinkedHashMap();
javax.tools.JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.getTask(null,new NewForwardingJavaFileManager(compiler.getStandardFileManager(null,null,null),linkedHashMap),null,null,null,arrayList).call();
int result = (int) new NewClassLoader(linkedHashMap).findClass(className).getMethod(methodName).invoke(null,new Object[]{});
System.out.println(result);
}
catch (Throwable throwable) {
System.out.println(throwable.getMessage());
}
}
private static class NewCharContent extends SimpleJavaFileObject {
private final String charSequence;
private NewCharContent(String string,String charSequence) {
super(URI.create("string:///"+string),Kind.SOURCE);
this.charSequence = charSequence;
}
@Override
public CharSequence getCharContent(boolean bool) {
return this.charSequence;
}
}
private static class NewForwardingJavaFileManager extends ForwardingJavaFileManager {
private final LinkedHashMap linkedHashMap;
private NewForwardingJavaFileManager(StandardJavaFileManager fileManager,LinkedHashMap linkedHashMap) {
super(fileManager);
this.linkedHashMap = linkedHashMap;
}
@Override
public JavaFileObject getJavaFileForOutput(final Location location,final String string,Kind kind,FileObject fileOject) {
return new NewJavaFileForOutput(string,this.linkedHashMap);
}
}
private static class NewJavaFileForOutput extends SimpleJavaFileObject {
private final String string;
private final LinkedHashMap linkedHashMap;
private NewJavaFileForOutput(String string,LinkedHashMap linkedHashMap) {
super(URI.create("string:///"+string+".class"),Kind.CLASS);
this.string = string;
this.linkedHashMap = linkedHashMap;
}
@Override
public OutputStream openOutputStream() {
return new NewOutputStream(this.string,this.linkedHashMap);
}
}
private static class NewOutputStream extends OutputStream {
private final String string;
private final LinkedHashMap linkedHashMap;
private final ByteArrayOutputStream byteArrayOutputStream;
private NewOutputStream(String string,LinkedHashMap linkedHashMap) {
this.string = string;
this.linkedHashMap = linkedHashMap;
this.byteArrayOutputStream = new ByteArrayOutputStream();
}
@Override
public void write(int intValue) {
this.byteArrayOutputStream.write(intValue);
}
@Override
public void close() throws IOException {
this.linkedHashMap.put(this.string,this.byteArrayOutputStream.toByteArray());
super.close();
}
}
private static class NewClassLoader extends ClassLoader {
private final LinkedHashMap linkedHashMap;
private NewClassLoader(LinkedHashMap linkedHashMap) {
this.linkedHashMap = linkedHashMap;
}
@Override
public Class findClass(String string) {
byte[] byteArray = this.linkedHashMap.get(string);
return defineClass(string,byteArray,0,byteArray.length);
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78753925/warning-try-with-resources-for-closing-super-outputstream[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия