@Override public Statement getBeanInstance(final InjectableInstance injectableInstance) { final IOCProcessingContext pCtx = injectableInstance.getInjectionContext().getProcessingContext(); pCtx.append(Stmt.declareFinalVariable(varName, proxyClass, newObject(proxyClass))); final MetaClass proxyResolverRef = parameterizedAs(ProxyResolver.class, typeParametersOf(proxiedType)); final BlockBuilder<AnonymousClassStructureBuilder> proxyResolverBody = newObject(proxyResolverRef) .extend().publicOverridesMethod("resolve", Parameter.of(proxiedType, "obj")); final Statement proxyResolver = proxyResolverBody._( ProxyMaker.closeProxy(Refs.get(varName), Refs.get("obj")) ).finish().finish(); proxyResolverBody._(Stmt.loadVariable("context").invoke("addProxyReference", Refs.get(varName), Refs.get("obj"))); pCtx.append(loadVariable("context").invoke("addUnresolvedProxy", proxyResolver, proxiedType, qualifyingMetadata.getQualifiers())); for (final Statement statement : closeStatements) { proxyResolverBody.append(statement); } setRendered(true); return loadVariable(varName); }
public ProxyInjector(final IOCProcessingContext context, final MetaClass proxiedType, final QualifyingMetadata metadata) { Assert.notNull(proxiedType); Assert.notNull(metadata); this.proxiedType = proxiedType; this.varName = InjectUtil.getNewInjectorName() + "_proxy"; this.qualifyingMetadata = AbstractInjector.getMetadataWithAny(metadata); final String proxyClassName = proxiedType.getName() + "_" + varName; this.closeStatements = new ArrayList<Statement>(); this.proxyClass = ProxyMaker.makeProxy(proxyClassName, proxiedType, context.isGwtTarget() ? "jsni" : "reflection"); this.proxyClass.setStatic(true); this.proxyClass.setScope(Scope.Package); context.getBootstrapClass() .addInnerClass(new InnerClass(proxyClass)); }