/** * {@inheritDoc} */ @SuppressWarnings("unchecked") public ElementMatcher<? super MethodDescription> resolve(TypeDescription typeDescription) { // Casting is required by some Java 6 compilers. return (ElementMatcher<? super MethodDescription>) (inverted ? not(isDeclaredBy(typeDescription)) : isDeclaredBy(typeDescription)); } }
private static ElementMatcher<MethodDescription> isGroovyMethod() { return isDeclaredBy(named("groovy.lang.GroovyObjectSupport")); }
/** * Matches a {@link ByteCodeElement} for being declared by a given {@link java.lang.Class}. This matcher matches * a declared element's raw declaring type. * * @param type The type that is expected to declare the matched byte code element. * @param <T> The type of the matched object. * @return A matcher for byte code elements being declared by the given {@code type}. */ public static <T extends ByteCodeElement> ElementMatcher.Junction<T> isDeclaredBy(Class<?> type) { return isDeclaredBy(TypeDescription.ForLoadedType.of(type)); }
/** * Matches a {@link ByteCodeElement} for being declared by a given {@link TypeDescription}. This matcher matches * a declared element's raw declaring type. * * @param type The type that is expected to declare the matched byte code element. * @param <T> The type of the matched object. * @return A matcher for byte code elements being declared by the given {@code type}. */ public static <T extends ByteCodeElement> ElementMatcher.Junction<T> isDeclaredBy(TypeDescription type) { return isDeclaredBy(is(type)); }
/** * Only matches the {@link Object#finalize()} method if it was not overridden. * * @param <T> The type of the matched object. * @return A matcher that only matches a non-overridden {@link Object#finalize()} method. */ public static <T extends MethodDescription> ElementMatcher.Junction<T> isDefaultFinalizer() { return isFinalizer().and(isDeclaredBy(TypeDescription.OBJECT)); }
/** {@inheritDoc} */ public DynamicType.Builder<?> transform(TypeDescription typeDescription, ByteBuddy byteBuddy, ClassFileLocator classFileLocator, MethodNameTransformer methodNameTransformer) { return byteBuddy.redefine(typeDescription, classFileLocator).ignoreAlso(not(isDeclaredBy(typeDescription))); } },
/** * {@inheritDoc} */ public ElementMatcher<? super MethodDescription> resolve(TypeDescription typeDescription) { return (ElementMatcher<? super MethodDescription>) not(ignoredMethods.resolve(typeDescription)) .and(isVirtual().and(not(isFinal())).or(isDeclaredBy(typeDescription))) .or(isDeclaredBy(typeDescription).and(not(predefinedMethodSignatures))); } }
/** * {@inheritDoc} */ public DynamicType make(String auxiliaryTypeName, ClassFileVersion classFileVersion, MethodAccessorFactory methodAccessorFactory) { LinkedHashMap<String, TypeDescription> parameterFields = extractFields(sourceMethod); DynamicType.Builder<?> builder = new ByteBuddy(classFileVersion) .with(TypeValidation.DISABLED) .subclass(forwardingType, ConstructorStrategy.Default.NO_CONSTRUCTORS) .name(auxiliaryTypeName) .modifiers(DEFAULT_TYPE_MODIFIER) .implement(serializableProxy ? new Class<?>[]{Serializable.class} : new Class<?>[0]) .method(ElementMatchers.<MethodDescription>isAbstract().and(isDeclaredBy(forwardingType))) .intercept(new MethodCall(sourceMethod, assigner)) .defineConstructor().withParameters(parameterFields.values()) .intercept(ConstructorCall.INSTANCE); for (Map.Entry<String, TypeDescription> field : parameterFields.entrySet()) { builder = builder.defineField(field.getKey(), field.getValue(), Visibility.PRIVATE); } return builder.make(); }
Class<? extends T> proxied = builder.method(ElementMatchers.isDeclaredBy( Introspectior.getTypeDescription(RLiveObject.class)) .and(ElementMatchers.isGetter().or(ElementMatchers.isSetter()) .method(ElementMatchers.isDeclaredBy(RObject.class) .or(ElementMatchers.isDeclaredBy(RObjectAsync.class))) .intercept(MethodDelegation.to(RObjectInterceptor.class)) .implement(RObject.class) .method(ElementMatchers.isDeclaredBy(RExpirable.class) .or(ElementMatchers.isDeclaredBy(RExpirableAsync.class))) .intercept(MethodDelegation.to(RExpirableInterceptor.class)) .implement(RExpirable.class) .method(ElementMatchers.isDeclaredBy(Map.class) .or(ElementMatchers.isDeclaredBy(ConcurrentMap.class)) .or(ElementMatchers.isDeclaredBy(RMapAsync.class)) .or(ElementMatchers.isDeclaredBy(RMap.class))) .intercept(MethodDelegation.to(RMapInterceptor.class)) .implement(RMap.class) .method(ElementMatchers.not(ElementMatchers.isDeclaredBy(Object.class)) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(RLiveObject.class))) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(RExpirable.class))) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(RExpirableAsync.class))) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(RObject.class))) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(RObjectAsync.class))) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(ConcurrentMap.class))) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(Map.class)))
/** * {@inheritDoc} */ public ElementMatcher<? super MethodDescription> resolve(TypeDescription typeDescription) { // Casting is required by JDK 6. return (ElementMatcher<? super MethodDescription>) isVirtual().and(not(isFinal())) .and(isVisibleTo(typeDescription)) .and(not(ignoredMethods.resolve(typeDescription))) .or(isDeclaredBy(typeDescription)); } }
@Override public <T> T newProxy(Class<T> interfaceType, Object handler) { Class<? extends T> cls = new ByteBuddy() .subclass(interfaceType) .method(ElementMatchers.isDeclaredBy(interfaceType)) .intercept(MethodDelegation.to(handler, "handler")) .make() .load(interfaceType.getClassLoader(), ClassLoadingStrategy.Default.INJECTION) .getLoaded(); try { return cls.newInstance(); } catch (Throwable t) { ThrowUtil.throwException(t); } return null; // never get here } });
Class<? extends T> proxied = builder.method(ElementMatchers.isDeclaredBy( Introspectior.getTypeDescription(RLiveObject.class)) .and(ElementMatchers.isGetter().or(ElementMatchers.isSetter()) .method(ElementMatchers.isDeclaredBy(RObject.class) .or(ElementMatchers.isDeclaredBy(RObjectAsync.class))) .intercept(MethodDelegation.to(RObjectInterceptor.class)) .implement(RObject.class) .method(ElementMatchers.isDeclaredBy(RExpirable.class) .or(ElementMatchers.isDeclaredBy(RExpirableAsync.class))) .intercept(MethodDelegation.to(RExpirableInterceptor.class)) .implement(RExpirable.class) .method(ElementMatchers.isDeclaredBy(Map.class) .or(ElementMatchers.isDeclaredBy(ConcurrentMap.class)) .or(ElementMatchers.isDeclaredBy(RMapAsync.class)) .or(ElementMatchers.isDeclaredBy(RMap.class))) .intercept(MethodDelegation.to(RMapInterceptor.class)) .implement(RMap.class) .method(ElementMatchers.not(ElementMatchers.isDeclaredBy(Object.class)) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(RLiveObject.class))) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(RExpirable.class))) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(RExpirableAsync.class))) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(RObject.class))) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(RObjectAsync.class))) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(ConcurrentMap.class))) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(Map.class)))
@Override public <T> T newProxy(Class<T> interfaceType, Object handler) { Class<? extends T> cls = new ByteBuddy() .subclass(interfaceType) .method(ElementMatchers.isDeclaredBy(interfaceType)) .intercept(MethodDelegation.to(handler, "handler")) .make() .load(interfaceType.getClassLoader(), ClassLoadingStrategy.Default.INJECTION) .getLoaded(); try { return cls.newInstance(); } catch (Throwable t) { ThrowUtil.throwException(t); } return null; // never get here } });
/** * {@inheritDoc} */ public DynamicType make(String auxiliaryTypeName, ClassFileVersion classFileVersion, MethodAccessorFactory methodAccessorFactory) { return new ByteBuddy(classFileVersion) .with(TypeValidation.DISABLED) .subclass(morphingType, ConstructorStrategy.Default.NO_CONSTRUCTORS) .name(auxiliaryTypeName) .modifiers(DEFAULT_TYPE_MODIFIER) .implement(serializableProxy ? new Class<?>[]{Serializable.class} : new Class<?>[0]) .defineConstructor().withParameters(specialMethodInvocation.getMethodDescription().isStatic() ? Collections.<TypeDescription>emptyList() : Collections.singletonList(instrumentedType)) .intercept(specialMethodInvocation.getMethodDescription().isStatic() ? StaticFieldConstructor.INSTANCE : new InstanceFieldConstructor(instrumentedType)) .method(ElementMatchers.<MethodDescription>isAbstract().and(isDeclaredBy(morphingType))) .intercept(new MethodCall(methodAccessorFactory.registerAccessorFor(specialMethodInvocation, MethodAccessorFactory.AccessType.DEFAULT), assigner)) .make(); }
.method(isVirtual() .and(not(isBridge().or(isHashCode()).or(isEquals()).or(isDefaultFinalizer()))) .and(not(isDeclaredBy(nameStartsWith("java.")).<MethodDescription>and(isPackagePrivate()))), Advice.withCustomMapping() .bind(MockMethodAdvice.Identifier.class, identifier)
private static Junction<MethodDescription> isPackagePrivateJavaMethods() { return isDeclaredBy(nameStartsWith("java.")).and(isPackagePrivate()); }
private <T> Class<? extends T> generateProviderProxyClass(ProviderProxyHandler proxyHandler, Class<T> providerCls) { try { return new ByteBuddy() .subclass(providerCls) .method(isDeclaredBy(providerCls)) .intercept(to(proxyHandler, "handler").filter(not(isDeclaredBy(Object.class)))) .make() .load(providerCls.getClassLoader(), INJECTION) .getLoaded(); } catch (Exception e) { logger.error("Generate proxy [{}, handler: {}] fail: {}.", providerCls, proxyHandler,e.getMessage()); return providerCls; } }
@Override public <T> T newProxy(Class<T> interfaceType, Object handler) { Class<? extends T> cls = new ByteBuddy() .subclass(interfaceType) .method(isDeclaredBy(interfaceType)) .intercept(to(handler, "handler").filter(not(isDeclaredBy(Object.class)))) .make() .load(interfaceType.getClassLoader(), INJECTION) .getLoaded(); return Reflects.newInstance(cls); } });
@Override public <T> T newProxy(Class<T> interfaceType, Object handler) { Class<? extends T> cls = new ByteBuddy() .subclass(interfaceType) .method(ElementMatchers.isDeclaredBy(interfaceType)) .intercept(MethodDelegation.to(handler, "handler")) .make() .load(interfaceType.getClassLoader(), ClassLoadingStrategy.Default.INJECTION) .getLoaded(); try { return cls.newInstance(); } catch (Throwable t) { ThrowUtil.throwException(t); } return null; // never get here } });
@Override public Class<?> generateProxyClass(ClassLoader classLoader, Class<?>... proxyClasses) { Class/*<? extends Echo>*/ dynamicUserType = new ByteBuddy() .subclass(proxyClasses[0]) .implement(ObjectInvokerAccessor.class).intercept(FieldAccessor.ofBeanProperty()) .method(not(isDeclaredBy(Object.class))) .intercept(MethodDelegation.to(DynamicDelegator.class)) .make() .load(getClass().getClassLoader()) .getLoaded(); return dynamicUserType; } }