我尝试过Janino,通过将字符串传递给janino编译器,我能够执行一个动态类。
现在,我应该动态创建几个类,然后将它们导入到另一个动态类中。
举个例子:
我如何才能取得这样的结果?
我的第一节动态课程是:
package com.Flink.POJO;
public class RainPOJO {
private String Altitude;
private String City_name;
private String Latitude;
private String Longitude;
private String Rainfall;
private String Station_name;
private String Time;
public String getAltitude() {
return Altitude;
}
public void setAltitude(String Altitude) {
this.Altitude = Altitude;
}
public String getCity_name() {
return City_name;
}
public void setCity_name(String City_name) {
this.City_name = City_name;
}
public String getLatitude() {
return Latitude;
}
public void setLatitude(String Latitude) {
this.Latitude = Latitude;
}
public String getLongitude() {
return Longitude;
}
public void setLongitude(String Longitude) {
this.Longitude = Longitude;
}
public String getRainfall() {
return Rainfall;
}
public void setRainfall(String Rainfall) {
this.Rainfall = Rainfall;
}
public String getStation_name() {
return Station_name;
}
public void setStation_name(String Station_name) {
this.Station_name = Station_name;
}
public String getTime() {
return Time;
}
public void setTime(String Time) {
this.Time = Time;
}
}然后,我必须从以下类调用该类,动态生成该类:
import org.apache.flink.api.common.functions.MapFunction;
import java.util.ArrayList;
import com.google.gson.JsonObject;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.common.operators.base.JoinOperatorBase;
import com.Flink.POJO.RainPOJO;
public class FlinkExecutor {
public FlinkExecutor() {}
public static void main(String[] args) throws Exception {
final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
env.setDegreeOfParallelism(1);
Source Rain = new Source("sensor", "rain");
String path_Rain = Rain.getCSVPath();
DataSet < RainPOJO > ds_s1 = env.readCsvFile("file://" + path_Rain)
.ignoreFirstLine()
.pojoType(RainPOJO.class, "table", "time", "longitude", "latitude", "average_rainfall", "maximum_rainfall");
ds_s1.map(new MapRain(ds_s1.count()))
.print();
}
}要编译我使用的第一个类:
SimpleCompiler compiler = new SimpleCompiler();
compiler.cook(p_class);
ClassLoader classloader = compiler.getClassLoader();
try {
Class<?> cl = classloader.loadClass("com.Flink.POJO.RainPOJO");
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
} 对于第二个类,它包含了主要的方法:
SimpleCompiler compiler = new SimpleCompiler();
compiler.cook(this.allClass);
try {
Class<?> cl = compiler.getClassLoader().loadClass("FlinkExecutor");
Method mainMeth = cl.getMethod("main", new Class[] { String[].class });
String[] methArgs = new String[] { "" }; // one input
mainMeth.invoke(null, new Object[] { methArgs });
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException e) {
e.printStackTrace();
}我得到的错误是:
org.codehaus.commons.compiler.CompileException:第8行,第7列:找不到类“com.Flink.POJO.RainPOJO”
Janino找不到类导入声明。
谢谢你,贾科莫
发布于 2019-09-19 11:30:15
从第一个编译器获取类加载器,使用setParentClassLoader()将其设置为第二个编译器
https://stackoverflow.com/questions/32866390
复制相似问题