0

曾经有人建议我如何将getter和setter动态添加到现有类中?我需要创建同一个类的实例以供进一步使用。我将在编译时上 Pojo 类。在运行时读取属性文件并需要创建 getter 和 setter 那些实体

4

5 回答 5

2

Java 没有内置的方法来添加全新的方法。您可以尝试使用嵌入式脚本引擎 (http://docs.oracle.com/javase/6/docs/api/javax/script/package-summary.html),然后使用 Javascript、jRuby、Groovy 等。那些语言将根据您的需要提供更多运行时功能,并且应该能够与您的 java 代码进行交互。

于 2012-11-07T05:25:13.533 回答
0

您可以为它创建一个包装器:

public class MyWrapper extends TheClass {
    private TheClass theClass;

    //getter/setters
}
于 2012-11-07T05:16:44.677 回答
0

如前所述,不可能,因为不允许动态修改类。

如果现有类上有一个接口可以改用,则可以使用 Java 的动态代理支持来添加 getter 和 setter。

private static class InstanceProxy implements InvocationHandler {
    public Object invoke(Object proxy, Method method, Object[] args) 
      throws Throwable {
        String methodName = method.getName();
        // Do logic based on method name
    }
}

并使用java.lang.reflect.Proxy.newProxyInstance.

这些代理对象将具有给定的接口和调用方法的动态逻辑。

于 2012-11-07T05:24:43.613 回答
0

这是可以做到的。通常 ORM 工具会做类似的事情。它被称为字节码编织/字节码增强。您可以使用 BCEL 等 3rd 方字节码工程库来完成它。

尝试谷歌搜索,这里有一些链接可以让您更深入地了解该主题。

字节码编织
字节码增强

于 2012-11-07T19:24:27.440 回答
0

根据您的编辑,最好Map<String, String>在 POJO 内部有一个在运行时加载新属性/值:

public class SomePojo {
    private int intAttribute;
    private String stringAttribute;
    private Map<String, String> dynamicProperties = new HashMap<String, String>();

    //getters and setters...
}

public class BLClass {

    public static void loadProperties(Properties properties, SomePojo pojo) {
        Enumeration<?> enumeration = properties.propertyNames();
        while (enumeration.hasMoreElements()) {
            String key = (String) enumeration.nextElement();
            String value = properties.getProperty(key);
            pojo.getDynamicProperties().put(key, value);
        }
    }
}
于 2012-11-07T05:26:13.323 回答