给定一个类名,我想动态创建一个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) 我有一个抽象类:
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)