java treemaker_Java TreeMaker.Literal方法代碼示例

本文介绍了如何在Java中使用TreeMaker的Literal方法来构造代码表达式,结合示例展示了如何在创建toString方法时拼接字段值,并处理包括调用父类toString、字段名包含、字段类型判断等复杂情况。
摘要由CSDN通过智能技术生成

import com.sun.tools.javac.tree.TreeMaker; //導入方法依賴的package包/類

private JCMethodDecl createToString(JavacNode typeNode, List fields, boolean includeFieldNames, boolean callSuper, FieldAccess fieldAccess, JCTree source) {

TreeMaker maker = typeNode.getTreeMaker();

JCAnnotation overrideAnnotation = maker.Annotation(chainDots(typeNode, "java", "lang", "Override"), List.nil());

JCModifiers mods = maker.Modifiers(Flags.PUBLIC, List.of(overrideAnnotation));

JCExpression returnType = chainDots(typeNode, "java", "lang", "String");

boolean first = true;

String typeName = getTypeName(typeNode);

String infix = ", ";

String suffix = ")";

String prefix;

if (callSuper) {

prefix = typeName + "(super=";

} else if (fields.isEmpty()) {

prefix = typeName + "()";

} else if (includeFieldNames) {

prefix = typeName + "(" + ((JCVariableDecl)fields.iterator().next().get()).name.toString() + "=";

} else {

prefix = typeName + "(";

}

JCExpression current = maker.Literal(prefix);

if (callSuper) {

JCMethodInvocation callToSuper = maker.Apply(List.nil(),

maker.Select(maker.Ident(typeNode.toName("super")), typeNode.toName("toString")),

List.nil());

current = maker.Binary(CTC_PLUS, current, callToSuper);

first = false;

}

for (JavacNode fieldNode : fields) {

JCExpression expr;

JCExpression fieldAccessor = createFieldAccessor(maker, fieldNode, fieldAccess);

JCExpression fieldType = getFieldType(fieldNode, fieldAccess);

// The distinction between primitive and object will be useful if we ever add a 'hideNulls' option.

boolean fieldIsPrimitive = fieldType instanceof JCPrimitiveTypeTree;

boolean fieldIsPrimitiveArray = fieldType instanceof JCArrayTypeTree && ((JCArrayTypeTree) fieldType).elemtype instanceof JCPrimitiveTypeTree;

boolean fieldIsObjectArray = !fieldIsPrimitiveArray && fieldType instanceof JCArrayTypeTree;

@SuppressWarnings("unused")

boolean fieldIsObject = !fieldIsPrimitive && !fieldIsPrimitiveArray && !fieldIsObjectArray;

if (fieldIsPrimitiveArray || fieldIsObjectArray) {

JCExpression tsMethod = chainDots(typeNode, "java", "util", "Arrays", fieldIsObjectArray ? "deepToString" : "toString");

expr = maker.Apply(List.nil(), tsMethod, List.of(fieldAccessor));

} else expr = fieldAccessor;

if (first) {

current = maker.Binary(CTC_PLUS, current, expr);

first = false;

continue;

}

if (includeFieldNames) {

current = maker.Binary(CTC_PLUS, current, maker.Literal(infix + fieldNode.getName() + "="));

} else {

current = maker.Binary(CTC_PLUS, current, maker.Literal(infix));

}

current = maker.Binary(CTC_PLUS, current, expr);

}

if (!first) current = maker.Binary(CTC_PLUS, current, maker.Literal(suffix));

JCStatement returnStatement = maker.Return(current);

JCBlock body = maker.Block(0, List.of(returnStatement));

return recursiveSetGeneratedBy(maker.MethodDef(mods, typeNode.toName("toString"), returnType,

List.nil(), List.nil(), List.nil(), body, null), source);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值