gpt4 book ai didi

java - 将代码插入方法 - Java

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:16:49 25 4
gpt4 key购买 nike

有没有办法自动将代码插入到方法中?

我有以下带有 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");.而且我不确定如何将字段插入到一个类中,在该类中我添加了一个 boolean 字段,该字段跟踪该字段之前是否已被修改(为了提高效率以防止必须操作 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;
}

最佳答案

是的,您可以,一种方法是使用某种形式的字节码操作(例如 javassistASM、BCEL)或位于这些工具之一之上的更高级别的 AOP 库,例如AspectJ , JBoss 面向对象编程。

注意:大多数 JDO 库这样做是为了处理持久性。

这是一个使用 javassist 的例子:

public class Person {

private String firstName;

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}
}

public static void rewritePersonClass() throws NotFoundException, CannotCompileException {
ClassPool pool = ClassPool.getDefault();
CtClass ctPerson = pool.get("Person");
CtClass ctSet = pool.get("java.util.LinkedHashSet");

CtField setField = new CtField(ctSet, "updatedFields", ctPerson);
ctPerson.addField(setField, "new java.util.LinkedHashSet();");

CtMethod method = ctPerson.getDeclaredMethod("setFirstName");
method.insertBefore("updatedFields.add(\"firstName\");");

ctPerson.toClass();
}


public static void main(String[] args) throws Exception {
rewritePersonClass();

Person p = new Person();
p.setFirstName("foo");

Field field = Person.class.getDeclaredField("updatedFields");
field.setAccessible(true);
Set<?> s = (Set<?>) field.get(p);

System.out.println(s);
}

关于java - 将代码插入方法 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3031239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com