是否可以通过反射动态创建类?

时间:2019-04-13 08:15:31

标签: java reflection

我正在创建一个库,并且在该库中,它将包含更精确的正则多边形和不规则多边形的形状,该库必须不仅允许用户使用我的形状,而且还可以在运行时创建自己的形状。

目前,我提供了以下几种形状:

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时,都会在形状上创建一个元素。

1 个答案:

答案 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()

}