我正在创建一个库,并且在该库中,它将包含更精确的正则多边形和不规则多边形的形状,该库必须不仅允许用户使用我的形状,而且还可以在运行时创建自己的形状。
目前,我提供了以下几种形状:
Polygon
|- PolygonRegular
|- Square
|- Circle
|- EquilateralTriangle implements Triangle
|- PolygonIrregular
|- Trapeze
|- IsoscelesTriangle implements Triangle
现在在这种情况下,假设我作为用户想在这种情况下创建我的自定义多边形“ ScaleneTriangle”,其中还将进一步实现Triangle接口,我的库必须轻松提供创建此“工厂”所必需的工具以创建形状。
//Though I don't know the code, what I wanted to achieve, would be something very close to:
Point2D[] points = new Point2D[]{
new Point2D.Float(0f, 0f),
new Point2D.Float(0.25f, 0f),
new Point2D.Float(1f, 1f),
};
ContentFactory.create(PolygonIrregular.class, "ScaleneTriangle", points);
但是,我不知道如何像这样创建一个ContentFactory,就像在魔术中一样在运行时创建类...我也将不得不创建这些类的实例。
在问题不太明确的情况下提供更多理解: 想象一下,我是一个用户,一个画布弹出,绘制了一个新形状。确认。在这个新形状的基础上创建了一个buttonRepresentation。每次用户单击buttonRepresentation时,都会在形状上创建一个元素。
答案 0 :(得分:1)
有几种方法可以做到这一点。
在this article中,这是使用jOOQ完成的,但是如果您不需要额外的依赖性,则可以重新实现其方法。 (archive for posterity)
我过去所做的方式(只是作为测试)是使用janino的编译器将字符串编译为实现了在编译时已知的接口的类。它在kotlin中,但是很容易转换成Java。
package com.dmercer
import org.codehaus.janino.SimpleCompiler;
import org.codehaus.janino.util.Benchmark
fun main(args: Array<String>) {
val sourceString = """
package com.dmercer;
public class B implements BasicInterface {
@Override
public void runMethod() {
System.out.println("Hello from compiled method");
}
}
""".trimIndent()
val compiler = SimpleCompiler()
compiler.cook(sourceString)
val classLoader = compiler.classLoader
val compiledClass = classLoader.loadClass("com.dmercer.B")// as IDBMethod
val classInstance = compiledClass.newInstance() as BasicInterface
classInstance.runMethod()
}