小编uro*_*vic的帖子

动态创建Groovy类

给定一个类名,我想动态创建一个Groovy类,为它添加属性和方法.我使用创建新类

instance = this.class.classLoader.parseClass(
                "public class $name {}")
Run Code Online (Sandbox Code Playgroud)

对于我使用的方法

instance.metaClass."$it.key" = it.value
Run Code Online (Sandbox Code Playgroud)

其中it.key是一个字符串(方法名称),it.value是一个闭包.这很方便,因为我可以指定方法参数类型并获取类型检查.但是,如果没有为其赋值,我无法指定动态创建的属性类型.我可以通过明确定义属性的getter和setter来解决这个问题.这可行,但似乎metaClass.name = value和metaClass.getName = {}实际上都没有在类中创建一个字段,因为Java字段运算符不适用于创建的属性.我可以将属性添加到Groovy类并指定其类型,而无需为其分配初始值或显式定义getter和setter方法吗?有没有办法向Groovy类添加新字段?这是脚本:

class SomeClass {
    Integer p1
    String p2
}

class ClassBuilder {
    def name
    def instance
    def properties
    def methods

    def ClassBuilder() {
        properties = [:]
        methods = [:]
    }

    def set_name(name) {
        this.name = name
    }

    def add_property(name, type) {
        properties[name] = type
    }

    def add_method(name, closure) {
        methods[name] = closure
    }

    def get_instance() {
        instance = this.class.classLoader.parseClass(
                "public class $name {}")

        properties.each …
Run Code Online (Sandbox Code Playgroud)

java groovy metaprogramming

3
推荐指数
1
解决办法
6644
查看次数

创建在编译时未知的类的实例

我有一个抽象类:

public abstract class Room {

}
Run Code Online (Sandbox Code Playgroud)

和编译时未知的继承类,如:

public class MagicRoom extends Room {

    public MagicRoom(){
        System.out.println("Creating a MagicRoom.");
    }

    public String magic = "";
}
Run Code Online (Sandbox Code Playgroud)

要么:

public class Dungeon extends Room {

    public Dungeon(){
        System.out.println("Creating a Dungeon");
    }

    public String keeper = "";
}
Run Code Online (Sandbox Code Playgroud)

我有一个类,我将创建这些类的实例:

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class MazeGame {

    public static Room makeRoom(Class roomClass) 
        throws IllegalArgumentException, InstantiationException, 
            IllegalAccessException, InvocationTargetException, 
            SecurityException, NoSuchMethodException{

        Constructor c = roomClass.getConstructor();
        return c.newInstance();

    }

}
Run Code Online (Sandbox Code Playgroud)

makeRoom是我尝试创建一个继承自Room的类,我在编译时不知道这个类,但是我不确定将什么作为返回类型而不是Room.因为makeRoom返回一个Room,如果我尝试使用属于继承类的字段,我会得到一个异常:

import java.lang.reflect.InvocationTargetException;

public class FactoryTest …
Run Code Online (Sandbox Code Playgroud)

java reflection inheritance design-patterns

2
推荐指数
1
解决办法
223
查看次数