下面列出了怎么用 com.sun.codemodel.JPrimitiveType 的API类实例代码及写法,或者点击链接到github查看源代码。
private void createReportingValueClass(JCodeModel codeModel, Class<? extends Value<?>> valueClazz, JPrimitiveType type) throws JClassAlreadyExistsException {
JClass reportClazz = codeModel.ref(Report.class);
JDefinedClass reportingValueClazz = codeModel._class(JMod.PUBLIC, asReportingClass(valueClazz), ClassType.CLASS);
reportingValueClazz._extends(codeModel.ref(valueClazz));
reportingValueClazz._implements(codeModel.ref(HasReport.class));
JFieldVar reportField = reportingValueClazz.field(JMod.PRIVATE, reportClazz, "report", JExpr._null());
createCopyMethod(reportingValueClazz);
createOperationMethods(reportingValueClazz, valueClazz, type);
createReportMethod(reportingValueClazz);
createExpressionMethods(reportingValueClazz);
createAccessorMethods(reportingValueClazz, reportField);
createFormatMethod(reportingValueClazz, type);
}
private void createReportingVectorClass(JCodeModel codeModel, Class<? extends Vector<?>> vectorClazz, JPrimitiveType type) throws JClassAlreadyExistsException {
JDefinedClass reportingVectorClazz = codeModel._class(JMod.ABSTRACT | JMod.PUBLIC, asReportingClass(vectorClazz), ClassType.CLASS);
reportingVectorClazz._extends(codeModel.ref(vectorClazz));
JFieldVar expressionField = reportingVectorClazz.field(JMod.PRIVATE, String.class, "expression", JExpr.lit(""));
createNewReportMethod(reportingVectorClazz);
createOperationMethods(reportingVectorClazz, vectorClazz, type);
createValueMethods(reportingVectorClazz, type);
createReportMethod(reportingVectorClazz);
createAccessorMethods(reportingVectorClazz, expressionField);
}
static
private void createReportingConstructor(JDefinedClass clazz, ExecutableElement executableElement, String operation, String initialOperation, JPrimitiveType type){
JCodeModel codeModel = clazz.owner();
JMethod constructor = clazz.constructor(JMod.PUBLIC);
List<? extends VariableElement> parameterElements = executableElement.getParameters();
for(VariableElement parameterElement : parameterElements){
constructor.param(toType(codeModel, parameterElement.asType()), String.valueOf(parameterElement.getSimpleName()));
}
JBlock body = constructor.body();
body.add(createSuperInvocation(clazz, constructor));
if((clazz.name()).endsWith("Value")){
JClass reportClazz = codeModel.ref(Report.class);
JVar reportParameter = constructor.param(reportClazz, "report");
body.add(JExpr.invoke("setReport").arg(reportParameter));
} // End if
if(initialOperation != null){
throw new RuntimeException();
}
body.add(JExpr.invoke("report").arg(createReportInvocation(clazz, operation, constructor.params(), type)));
}
static
private void createAggregationMethod(JDefinedClass clazz, JClass valueClazz, String name, JExpression valueExpression, String operation, JPrimitiveType type){
JMethod method = clazz.method(JMod.PUBLIC, valueClazz, name);
method.annotate(Override.class);
JBlock body = method.body();
body._return(JExpr._new(valueClazz).arg(valueExpression).arg(JExpr.invoke("newReport")).arg(createReportInvocation(clazz, operation, Collections.emptyList(), type)));
}
static
private JInvocation createReportInvocation(JDefinedClass clazz, String operation, List<JVar> parameters, JPrimitiveType type){
JCodeModel codeModel = clazz.owner();
JClass stringBuilderClazz = codeModel.ref(StringBuilder.class);
return createReportInvocation(clazz, JExpr._new(stringBuilderClazz).arg(JExpr.lit(256)), operation, parameters, type);
}
public JCMPrimitiveType(JCMTypeFactory factory, JPrimitiveType type) {
super(factory, type);
}
public static JClass box(JType t) {
if (t instanceof JClass)
return (JClass) t;
else
return ((JPrimitiveType) t).boxify();
}
static
private void createReportingMethod(JDefinedClass clazz, ExecutableElement executableElement, String operation, String initialOperation, JPrimitiveType type){
JCodeModel codeModel = clazz.owner();
String name = String.valueOf(executableElement.getSimpleName());
JMethod method = clazz.method(JMod.PUBLIC, clazz, name);
method.annotate(Override.class);
List<JVar> params = new ArrayList<>();
List<? extends VariableElement> parameterElements = executableElement.getParameters();
for(VariableElement parameterElement : parameterElements){
TypeMirror paramType = parameterElement.asType();
Name paramName = parameterElement.getSimpleName();
JVar param;
if((TypeKind.ARRAY).equals(paramType.getKind())){
ArrayType arrayType = (ArrayType)paramType;
param = method.varParam(toType(codeModel, arrayType.getComponentType()), String.valueOf(paramName));
} else
{
param = method.param(toType(codeModel, paramType), String.valueOf(paramName));
}
params.add(param);
}
String valueMethod;
if((codeModel.DOUBLE).equals(type)){
valueMethod = "doubleValue";
} else
if((codeModel.FLOAT).equals(type)){
valueMethod = "floatValue";
} else
{
throw new IllegalArgumentException();
}
boolean checkChange;
switch(name){
case "add":
case "subtract":
case "multiply":
case "divide":
checkChange = (clazz.name()).endsWith("Value");
break;
default:
checkChange = false;
break;
}
JBlock body = method.body();
JVar oldValueVar = null;
if(checkChange){
oldValueVar = body.decl(type, "oldValue", JExpr.invoke(valueMethod));
}
JVar resultVariable = body.decl(clazz, "result", JExpr.cast(clazz, createSuperInvocation(clazz, method)));
JVar newValueVar = null;
if(checkChange){
newValueVar = body.decl(type, "newValue", JExpr.invoke(valueMethod));
}
JBlock block = body;
if(checkChange){
block = body._if((oldValueVar).ne(newValueVar))._then();
}
if(initialOperation != null){
JConditional ifStatement = block._if(JExpr.invoke("hasExpression"));
JBlock trueBlock = ifStatement._then();
trueBlock.add(JExpr.invoke("report").arg(createReportInvocation(clazz, operation, params, type)));
JBlock falseBlock = ifStatement._else();
falseBlock.add(JExpr.invoke("report").arg(createReportInvocation(clazz, initialOperation, params, type)));
} else
{
block.add(JExpr.invoke("report").arg(createReportInvocation(clazz, operation, params, type)));
}
body._return(resultVariable);
}
static
private void createFormatMethod(JDefinedClass clazz, JPrimitiveType type){
JCodeModel codeModel = clazz.owner();
JClass numberClazz = codeModel.ref(Number.class);
JClass stringBuilderClazz = codeModel.ref(StringBuilder.class);
JMethod method = clazz.method(JMod.STATIC | JMod.PRIVATE, String.class, "format");
JVar valuesParameter = method.varParam(numberClazz, "values");
JBlock body = method.body();
JVar sbVariable = body.decl(stringBuilderClazz, "sb", JExpr._new(stringBuilderClazz).arg(valuesParameter.ref("length").mul(JExpr.lit(32))));
JForEach forStatement = body.forEach(numberClazz, "value", valuesParameter);
JBlock forBody = forStatement.body();
forBody.add(createReportInvocation(clazz, sbVariable, "${0}", Collections.singletonList(forStatement.var()), type));
body._return(sbVariable.invoke("toString"));
}