private static TemplateRenderer tryToCompile(String source, Map<String, String> expressions) throws NotFoundException, CannotCompileException, InstantiationException, IllegalAccessException { ClassPool cp = ClassPool.getDefault(); CtClass sup = cp.get(Object.class.getCanonicalName()); CtClass cls = cp.makeClass("RapidoidTemplate" + ID_GEN.incrementAndGet(), sup); cls.addInterface(cp.get(TemplateRenderer.class.getCanonicalName())); cls.addConstructor(CtNewConstructor.defaultConstructor(cls)); for (Map.Entry<String, String> expr : expressions.entrySet()) { String fld = "private static final org.rapidoid.render.retriever.ValueRetriever %s = org.rapidoid.render.retriever.Retriever.of(%s);"; String retrieverId = retrieverId(expr.getKey()); String prop = expr.getValue(); String field = U.frmt(fld, retrieverId, prop); cls.addField(CtField.make(field, cls)); } CtClass[] params = {cp.get(RenderCtx.class.getCanonicalName())}; CtClass clsVoid = cp.get(void.class.getCanonicalName()); cls.addMethod( CtNewMethod.make(Modifier.PUBLIC, clsVoid, "render", params, new CtClass[0], source, cls)); return (TemplateRenderer) cls.toClass().newInstance(); }
public void onWrite(ClassPool pool, String className) throws NotFoundException, CannotCompileException { CtClass cc = pool.get(className); try { if (isPersistent(className)) { CtClass base = cc.getSuperclass(); CtConstructor cons = new CtConstructor(constructorParams, cc); if (base.subclassOf(persistent) || base == object) { cons.setBody(null); cc.addConstructor(cons); if (base == object) { cc.setSuperclass(persistent); } } else { if (!isPersistent(base.getName())) { throw new NotFoundException( "Base class " + base.getName() + " was not declared as persistent"); } cons.setBody("super($0);"); cc.addConstructor(cons); } preprocessMethods(cc, true, true); if (base == persistent || base == object) { CtMethod m = new CtMethod(isRecursive, cc, null); m.setBody("return false;"); cc.addMethod(m); addSerializeMethods(cc, false); } else if (base.subtypeOf(serializable)) { addSerializeMethods(cc, true); } if ((cc.getModifiers() & Modifier.PRIVATE) == 0) { CtClass f = pool.makeClass(className + "LoadFactory"); f.addInterface(factory); CtMethod c = new CtMethod(create, f, null); c.setBody("return new " + className + "($1);"); f.addMethod(c); CtNewConstructor.defaultConstructor(f); } } else { preprocessMethods( cc, cc.subtypeOf(persistent) && cc != persistent, !className.startsWith("org.nachodb")); } } catch (Exception x) { x.printStackTrace(); } }
// 用javassit得到动态代理 public T createJavassistBytecodeDynamicProxy( LoadBalancer loadBalance, ConcurrentMap<String, T> map, Class ifaces) { try { ClassPool mPool = new ClassPool(true); CtClass mCtc = mPool.makeClass(ifaces.getName() + "JavaassistProxy"); mCtc.addInterface(mPool.get(ifaces.getName())); mCtc.addConstructor(CtNewConstructor.defaultConstructor(mCtc)); mCtc.addField(CtField.make("public " + loadBalance.getClass().getName() + " sub;", mCtc)); mCtc.addField(CtField.make("public " + map.getClass().getName() + " map;", mCtc)); // mCtc.addField(CtField.make("public " + ArrayList.class.getName() + " list;", // mCtc)); mCtc.addMethod( CtNewMethod.make( "public Object getRealClient() { return (Object)sub.select(new " + ArrayList.class.getName() + "(map.values())); }", mCtc)); // 获取接口的方法 for (Method method : ifaces.getMethods()) { Class returnType = method.getReturnType(); String modifiers = "public"; if (Modifier.PUBLIC == method.getModifiers()) { modifiers = "public"; } else if (Modifier.PROTECTED == method.getModifiers()) { modifiers = "protected"; } else if (Modifier.PRIVATE == method.getModifiers()) { modifiers = "private"; } Class<?>[] parameter = method.getParameterTypes(); String params = ""; String ps = ""; for (Class param : parameter) { params += param.getName() + " " + param.getName() + ","; ps += param.getName() + ","; } if (params.equals("")) { params = ""; ps = ""; } else { params = params.substring(0, params.length()); ps = ps.substring(0, ps.length()); } mCtc.addMethod( CtNewMethod.make( modifiers + " void " + method.getName() + "(String a,String b){ Object t=this.getRealClient(); return ((" + ifaces.getName() + ")t)." + method.getName() + "(a,b) ;}", mCtc)); // mCtc.addMethod(CtNewMethod.make("public int count() { return // delegate.count(); }", mCtc)); } Class<?> pc = mCtc.toClass(); mCtc.debugWriteFile("/home/liguojun"); mCtc.writeFile("/home/liguojun"); T bytecodeProxy = (T) pc.newInstance(); Field filed = bytecodeProxy.getClass().getField("sub"); filed.set(bytecodeProxy, loadBalance); Field filed1 = bytecodeProxy.getClass().getField("map"); filed1.set(bytecodeProxy, map); return bytecodeProxy; } catch (Exception e) { e.printStackTrace(); } return null; }