/** * mixin interface and delegates. * all class must be public. * * @param ics interface class array. * @param dc delegate class. * @return Mixin instance. */ public static Mixin mixin(Class<?>[] ics, Class<?> dc) { return mixin(ics, new Class[]{dc}); }
public static ClassGenerator newInstance(ClassLoader loader) { return new ClassGenerator(getClassPool(loader)); }
public ClassGenerator addField(String name, int mod, Class<?> type) { return addField(name, mod, type, null); }
@SuppressWarnings("unchecked") public <T> T getProxy(Invoker<T> invoker, Class<?>[] interfaces) { return (T) Proxy.getProxy(interfaces).newInstance(new InvokerInvocationHandler(invoker)); }
/** * get instance with special handler. * * @return instance. */ abstract public Object newInstance(InvocationHandler handler);
/** * get wrapper. * * @param c * Class instance. * @return Wrapper instance(not null). */ public static Wrapper getWrapper(Class<?> c) { while (ClassGenerator.isDynamicClass(c)) // can not wrapper on dynamic // class. c = c.getSuperclass(); if (c == Object.class) return OBJECT_WRAPPER; Wrapper ret = WRAPPER_MAP.get(c); if (ret == null) { ret = makeWrapper(c); WRAPPER_MAP.put(c, ret); } return ret; }
/** * Get proxy. * * @param ics interface class array. * @return Proxy instance. */ public static Proxy getProxy(Class<?>... ics) { return getProxy(ClassHelper.getClassLoader(Proxy.class), ics); }
public ClassGenerator addMethod(String name, int mod, Class<?> rt, Class<?>[] pts, String body) { return addMethod(name, mod, rt, pts, null, body); }
@Override protected Object doInvoke(T proxy, String methodName, Class<?>[] parameterTypes, Object[] arguments) throws Throwable { return wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments); } };
public ClassGenerator addConstructor(int mod, Class<?>[] pts, String body) { return addConstructor(mod, pts, null, body); }
/** * get property value. * * @param instance * instance. * @param pns * property name array. * @return value array. */ public Object[] getPropertyValues(Object instance, String[] pns) throws JahhanException, IllegalArgumentException { Object[] ret = new Object[pns.length]; for (int i = 0; i < ret.length; i++) ret[i] = getPropertyValue(instance, pns[i]); return ret; }
public ClassGenerator addInterface(Class<?> cl) { return addInterface(cl.getName()); }
/** * set property value. * * @param instance * instance. * @param pns * property name array. * @param pvs * property value array. */ public void setPropertyValues(Object instance, String[] pns, Object[] pvs) throws JahhanException, IllegalArgumentException { if (pns.length != pvs.length) throw new IllegalArgumentException("pns.length != pvs.length"); for (int i = 0; i < pns.length; i++) setPropertyValue(instance, pns[i], pvs[i]); }
/** * has method. * * @param name * method name. * @return has or has not. */ public boolean hasMethod(String name) { for (String mn : getMethodNames()) if (mn.equals(name)) return true; return false; }
private static String args(Class<?>[] cs, String name) { int len = cs.length; if (len == 0) return ""; StringBuilder sb = new StringBuilder(); for (int i = 0; i < len; i++) { if (i > 0) sb.append(','); sb.append(arg(cs[i], name + "[" + i + "]")); } return sb.toString(); }
private CtConstructor getCtConstructor(Constructor<?> c) throws NotFoundException { return getCtClass(c.getDeclaringClass()).getConstructor(ReflectUtils.getDesc(c)); }
public static ClassGenerator newInstance() { return new ClassGenerator(getClassPool(Thread.currentThread().getContextClassLoader())); }
/** * mixin interface and delegates. * all class must be public. * * @param ics interface class array. * @param dc delegate class. * @param cl class loader. * @return Mixin instance. */ public static Mixin mixin(Class<?>[] ics, Class<?> dc, ClassLoader cl) { return mixin(ics, new Class[]{dc}, cl); }
public ClassGenerator addMethod(Method m) { addMethod(m.getName(), m); return this; }
/** * mixin interface and delegates. * all class must be public. * * @param ics interface class array. * @param dcs delegate class array. * @return Mixin instance. */ public static Mixin mixin(Class<?>[] ics, Class<?>[] dcs) { return mixin(ics, dcs, ClassHelper.getCallerClassLoader(Mixin.class)); }