我寫了AST變換創建一個JPA映射屬性的設置(這兩種設置本地現場和關係的另一端調用setOwner
):爲什麼我的Groovy AST在我的方法轉換的末尾插入空?
private static void createSetter(FieldNode field) {
Parameter parameter = GeneralUtils.param(field.getType(), field.getName());
BlockStatement body = new BlockStatement();
body.addStatement(assignS(fieldX(field), varX(parameter)));
MethodCallExpression setterCall = callX(varX(parameter), "setOwner", varX("this", field.getDeclaringClass()));
setterCall.setType(ClassHelper.VOID_TYPE);
body.addStatement(stmt(setterCall));
MethodNode method = new MethodNode(setterName(field.getName()), ACC_PUBLIC, ClassHelper.VOID_TYPE, new Parameter[] {parameter}, ClassNode.EMPTY_ARRAY, body);
field.getDeclaringClass().addMethod(method);
}
這工作,但生成的方法有在最後一個奇怪的null
聲明由JD-GUI(除了一個奇怪的局部變量)拆卸:
public void setMore(Simple_MoreStuff more) {
Simple_MoreStuff localSimple_MoreStuff = more;
this.more = localSimple_MoreStuff;
more.setOwner(this);
null;
}
這似乎並沒有影響到實際的正確性,但它是奇怪,好像一個錯誤。在MethodCallExpression
,我發現這個註釋,但不知道這是否涉及,因爲我的方法其實是無效(我明確設置它上面,它使沒有區別):
//TODO: set correct type here
// if setting type and a methodcall is the last expression in a method,
// then the method will return null if the method itself is not void too!
// (in bytecode after call: aconst_null, areturn)
有沒有辦法讓從具有雜散null
生成的方法?
我注意到,自動添加的無聊setter是簡單的'this.x = param'形式,沒有別的。爲什麼該代碼避免冗餘? – chrylis
因爲我們設法避免了某些情況下的死代碼部分。要清楚:這個死代碼是不是真的需要。正是在那裏,以滿足主要驗證和不能夠做的字節碼地址的重排,以避免這種情況的需要字節碼後端的內部結構的結果。所以在某些情況下,代碼是寫入的,而在其他情況下則不是。 – blackdrag