/** * Creates rule info using rule name, parameters types and return type. * * @param ruleName rule name * @param paramTypes parameters types * @param returnType return type * @return rule info */ public static RuleInfo createRuleInfo(String ruleName, Class<?>[] paramTypes, Class<?> returnType) { RuleInfo ruleInfo = new RuleInfo(); ruleInfo.setName(ruleName); ruleInfo.setParamTypes(paramTypes); ruleInfo.setReturnType(returnType); return ruleInfo; }
private static String getRuleInfoSignature(RuleInfo ruleInfo){ StringBuilder sb = new StringBuilder(); sb.append(ruleInfo.getReturnType().getCanonicalName()); sb.append(" "); sb.append(ruleInfo.getName()); sb.append("("); boolean first = true; for (Class<?> paramType : ruleInfo.getParamTypes()){ if (first){ first = false; }else{ sb.append(", "); } sb.append(paramType.getCanonicalName()); } sb.append(")"); return sb.toString(); }
/** * Gets string that contains rule types (parameters types and return type). * * @param ruleInfo rule info * @return string with rule types */ private static String getMethodTypes(RuleInfo ruleInfo) { Class<?> returnType = ruleInfo.getReturnType(); Class<?>[] paramTypes = ruleInfo.getParamTypes(); StringBuilder builder = new StringBuilder("("); for (int i = 0; i < paramTypes.length; i++) { builder.append(Type.getType(paramTypes[i])); } builder.append(")"); builder.append(Type.getType(returnType)); return builder.toString(); }
/** * Generates interface class using collection of rules. * * @param className name of result class * @param rules collection of rules what will be used as interface methods * @param classLoader class loader what will be used to load generated * interface * @return generated interface * @throws Exception if an error has occurred */ public static Class<?> generateInterface(String className, RuleInfo[] rules, ClassLoader classLoader) throws Exception { ClassWriter classWriter = new ClassWriter(0); String name = className.replace('.', '/'); classWriter.visit(Opcodes.V1_7, PUBLIC_ABSTRACT_INTERFACE, name, null, JAVA_LANG_OBJECT, null); for (RuleInfo ruleInfo : rules) { String ruleName = ruleInfo.getName(); classWriter.visitMethod(PUBLIC_ABSTRACT, ruleName, getMethodTypes(ruleInfo), null, null); } classWriter.visitEnd(); // Create class object. // ClassUtils.defineClass(className, classWriter.toByteArray(), classLoader); // Return loaded to classpath class object. // return Class.forName(className, true, classLoader); }
boolean isMember = isMember(ruleInfo, includes, excludes); if (isMember) { MethodKey key = new MethodKey(ruleInfo.getName(), IOpenClass.EMPTY);