【发布时间】:2011-03-03 03:42:07
【问题描述】:
有没有办法在方法中自动插入代码?
我有以下带有 getter 和 setter 的典型字段,我想将指示的代码插入到记录该字段是否被修改的 setter 方法中,以插入指示的“isFirstNameModified”字段以跟踪该字段是否是否修改过。
public class Person {
Set<String> updatedFields = new LinkedHashSet<String>();
String firstName;
public String getFirstName(){
return firstName;
}
boolean isFirstNameChanged = false; // This code is inserted later
public void setFirstName(String firstName){
if( !isFirstNameChanged ){ // This code is inserted later
isFirstNameChanged = true; // This code is inserted later
updatedFields.add("firstName"); // This code is inserted later
} // This code is inserted later
this.firstName = firstName;
}
}
我也不确定是否可以将方法名称的子集作为方法本身内部的字符串,如我将 fieldName 作为字符串添加到更新字段集的行中所示:updatedFields.add("firstName");。而且我不确定如何将字段插入到一个类中,在该类中我添加了一个布尔字段来跟踪该字段是否已被修改(为了提高效率以防止不得不操作 Set):boolean isFirstNameChanged = false;
似乎最明显的答案是在 Eclipse 中使用代码模板,但我担心以后必须返回并更改代码。
编辑:::::::::
我应该使用这个更简单的代码而不是上面的示例。它所做的只是将字段名称作为字符串添加到集合中。
public class Person {
Set<String> updatedFields = new LinkedHashSet<String>();
String firstName;
public String getFirstName(){
return firstName;
}
public void setFirstName(String firstName){
updatedFields.add("firstName"); // This code is inserted later
this.firstName = firstName;
}
}
【问题讨论】:
-
你的意思是在运行时动态吗?
-
可能在运行时发生,但它甚至可能在编译时发生。我只是不想以这样一种方式编码它,如果我想改变它的实现方式,我必须手动重新做所有事情
-
"(为了提高效率以防止不得不操纵 Set)" 这将是您对效率的最后一个关注点。听起来你想在运行时以某种方式修改方法?我希望有 100 个更好的解决方案来解决您的问题。
-
@Ed Swangren - 什么是更好的解决方案?我的印象是该集合必须遍历字符串中的字符才能对其进行哈希处理,然后在 O(logN) 附近的某处进行插入?
-
你有像
firstName这样的百万属性来优化集合的add方法吗?
标签: java reflection code-generation aspectj