From b0b2bbc85720c550305f3f9f1e466bdb42e034ed Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Fri, 9 Dec 2022 00:56:38 -0500 Subject: [PATCH] Polish CGLIB fork - primarily automated "clean up" using Eclipse IDE --- .../cglib/beans/BeanCopier.java | 51 ++++--- .../cglib/beans/BeanGenerator.java | 33 +++-- .../springframework/cglib/beans/BeanMap.java | 88 +++++++----- .../cglib/beans/BeanMapEmitter.java | 45 ++++-- .../springframework/cglib/beans/BulkBean.java | 40 +++--- .../cglib/beans/BulkBeanEmitter.java | 16 ++- .../cglib/beans/BulkBeanException.java | 7 +- .../cglib/beans/FixedKeySet.java | 13 +- .../cglib/beans/ImmutableBean.java | 34 +++-- .../cglib/core/AbstractClassGenerator.java | 43 +++--- .../org/springframework/cglib/core/Block.java | 2 +- .../cglib/core/ClassEmitter.java | 91 +++++++----- .../springframework/cglib/core/ClassInfo.java | 18 +-- .../cglib/core/ClassNameReader.java | 46 +++--- .../cglib/core/ClassesKey.java | 2 +- .../cglib/core/CodeEmitter.java | 14 +- .../cglib/core/CodeGenerationException.java | 3 +- .../cglib/core/CollectionUtils.java | 6 +- .../springframework/cglib/core/Constants.java | 2 +- .../cglib/core/DefaultGeneratorStrategy.java | 7 +- .../cglib/core/DefaultNamingPolicy.java | 5 +- .../cglib/core/DuplicatesPredicate.java | 12 +- .../springframework/cglib/core/EmitUtils.java | 94 ++++-------- .../cglib/core/GeneratorStrategy.java | 3 +- .../cglib/core/KeyFactory.java | 33 +++-- .../org/springframework/cglib/core/Local.java | 4 +- .../cglib/core/LocalVariablesSorter.java | 35 +++-- .../cglib/core/MethodInfo.java | 57 ++++---- .../cglib/core/MethodWrapper.java | 7 +- .../springframework/cglib/core/Predicate.java | 5 +- .../cglib/core/ReflectUtils.java | 58 ++++---- .../cglib/core/RejectModifierPredicate.java | 5 +- .../springframework/cglib/core/Signature.java | 20 +-- .../cglib/core/SpringNamingPolicy.java | 1 + .../springframework/cglib/core/TypeUtils.java | 26 ++-- .../cglib/core/VisibilityPredicate.java | 13 +- .../core/internal/CustomizerRegistry.java | 4 +- .../cglib/core/internal/LoadingCache.java | 19 +-- .../cglib/proxy/BridgeMethodResolver.java | 16 ++- .../cglib/proxy/CallbackFilter.java | 5 +- .../cglib/proxy/CallbackGenerator.java | 6 +- .../cglib/proxy/CallbackHelper.java | 63 ++++---- .../cglib/proxy/CallbackInfo.java | 10 +- .../cglib/proxy/DispatcherGenerator.java | 16 ++- .../springframework/cglib/proxy/Enhancer.java | 84 ++++++----- .../springframework/cglib/proxy/Factory.java | 8 +- .../cglib/proxy/FixedValueGenerator.java | 16 ++- .../cglib/proxy/InterfaceMaker.java | 30 ++-- .../proxy/InvocationHandlerGenerator.java | 19 ++- .../cglib/proxy/LazyLoaderGenerator.java | 23 ++- .../cglib/proxy/MethodInterceptor.java | 2 +- .../proxy/MethodInterceptorGenerator.java | 7 +- .../cglib/proxy/MethodProxy.java | 3 +- .../cglib/proxy/MixinBeanEmitter.java | 9 +- .../cglib/proxy/MixinEmitter.java | 28 ++-- .../cglib/proxy/MixinEverythingEmitter.java | 16 ++- .../cglib/proxy/NoOpGenerator.java | 15 +- .../springframework/cglib/proxy/Proxy.java | 26 ++-- .../proxy/UndeclaredThrowableException.java | 2 +- .../cglib/reflect/ConstructorDelegate.java | 30 ++-- .../cglib/reflect/FastClass.java | 46 +++--- .../cglib/reflect/FastClassEmitter.java | 75 ++++++---- .../cglib/reflect/FastConstructor.java | 6 +- .../cglib/reflect/FastMember.java | 8 +- .../cglib/reflect/FastMethod.java | 9 +- .../cglib/reflect/MulticastDelegate.java | 20 ++- .../AbstractClassFilterTransformer.java | 42 +++--- .../cglib/transform/AbstractClassLoader.java | 55 ++++--- .../transform/AbstractClassTransformer.java | 5 +- .../cglib/transform/AnnotationVisitorTee.java | 35 +++-- .../cglib/transform/ClassFilter.java | 4 +- .../cglib/transform/ClassReaderGenerator.java | 9 +- .../transform/ClassTransformerChain.java | 11 +- .../cglib/transform/ClassTransformerTee.java | 9 +- .../cglib/transform/ClassVisitorTee.java | 54 ++++--- .../cglib/transform/FieldVisitorTee.java | 18 ++- .../transform/MethodFilterTransformer.java | 10 +- .../cglib/transform/MethodVisitorTee.java | 135 +++++++++++------- .../impl/AbstractInterceptFieldCallback.java | 56 +++++--- .../impl/AddDelegateTransformer.java | 10 +- .../impl/AddPropertyTransformer.java | 11 +- .../impl/AddStaticInitTransformer.java | 13 +- .../cglib/transform/impl/FieldProvider.java | 10 +- .../impl/InterceptFieldCallback.java | 2 +- .../impl/InterceptFieldTransformer.java | 30 ++-- .../impl/UndeclaredThrowableStrategy.java | 13 +- .../impl/UndeclaredThrowableTransformer.java | 9 +- .../cglib/util/ParallelSorter.java | 6 +- .../cglib/util/SorterTemplate.java | 4 +- 89 files changed, 1233 insertions(+), 878 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/cglib/beans/BeanCopier.java b/spring-core/src/main/java/org/springframework/cglib/beans/BeanCopier.java index 30a00e8d1d0..b5fbfa46de0 100644 --- a/spring-core/src/main/java/org/springframework/cglib/beans/BeanCopier.java +++ b/spring-core/src/main/java/org/springframework/cglib/beans/BeanCopier.java @@ -16,12 +16,25 @@ package org.springframework.cglib.beans; import java.beans.PropertyDescriptor; -import java.lang.reflect.*; +import java.lang.reflect.Modifier; import java.security.ProtectionDomain; -import org.springframework.cglib.core.*; +import java.util.HashMap; +import java.util.Map; + import org.springframework.asm.ClassVisitor; import org.springframework.asm.Type; -import java.util.*; +import org.springframework.cglib.core.AbstractClassGenerator; +import org.springframework.cglib.core.ClassEmitter; +import org.springframework.cglib.core.CodeEmitter; +import org.springframework.cglib.core.Constants; +import org.springframework.cglib.core.Converter; +import org.springframework.cglib.core.EmitUtils; +import org.springframework.cglib.core.KeyFactory; +import org.springframework.cglib.core.Local; +import org.springframework.cglib.core.MethodInfo; +import org.springframework.cglib.core.ReflectUtils; +import org.springframework.cglib.core.Signature; +import org.springframework.cglib.core.TypeUtils; /** * @author Chris Nokleberg @@ -39,7 +52,7 @@ abstract public class BeanCopier new Signature("copy", Type.VOID_TYPE, new Type[]{ Constants.TYPE_OBJECT, Constants.TYPE_OBJECT, CONVERTER }); private static final Signature CONVERT = TypeUtils.parseSignature("Object convert(Object, Class, Object)"); - + interface BeanCopierKey { public Object newInstance(String source, String target, boolean useConverter); } @@ -65,14 +78,14 @@ abstract public class BeanCopier } public void setSource(Class source) { - if(!Modifier.isPublic(source.getModifiers())){ + if(!Modifier.isPublic(source.getModifiers())){ setNamePrefix(source.getName()); } this.source = source; } - + public void setTarget(Class target) { - if(!Modifier.isPublic(target.getModifiers())){ + if(!Modifier.isPublic(target.getModifiers())){ setNamePrefix(target.getName()); } this.target = target; @@ -85,11 +98,13 @@ abstract public class BeanCopier this.useConverter = useConverter; } - protected ClassLoader getDefaultClassLoader() { + @Override + protected ClassLoader getDefaultClassLoader() { return source.getClassLoader(); } - protected ProtectionDomain getProtectionDomain() { + @Override + protected ProtectionDomain getProtectionDomain() { return ReflectUtils.getProtectionDomain(source); } @@ -98,7 +113,8 @@ abstract public class BeanCopier return (BeanCopier)super.create(key); } - public void generateClass(ClassVisitor v) { + @Override + public void generateClass(ClassVisitor v) { Type sourceType = Type.getType(source); Type targetType = Type.getType(target); ClassEmitter ce = new ClassEmitter(v); @@ -115,8 +131,8 @@ abstract public class BeanCopier PropertyDescriptor[] setters = ReflectUtils.getBeanSetters(target); Map names = new HashMap(); - for (int i = 0; i < getters.length; i++) { - names.put(getters[i].getName(), getters[i]); + for (PropertyDescriptor getter : getters) { + names.put(getter.getName(), getter); } Local targetLocal = e.make_local(); Local sourceLocal = e.make_local(); @@ -124,7 +140,7 @@ abstract public class BeanCopier e.load_arg(1); e.checkcast(targetType); e.store_local(targetLocal); - e.load_arg(0); + e.load_arg(0); e.checkcast(sourceType); e.store_local(sourceLocal); } else { @@ -133,8 +149,7 @@ abstract public class BeanCopier e.load_arg(0); e.checkcast(sourceType); } - for (int i = 0; i < setters.length; i++) { - PropertyDescriptor setter = setters[i]; + for (PropertyDescriptor setter : setters) { PropertyDescriptor getter = (PropertyDescriptor)names.get(setter.getName()); if (getter != null) { MethodInfo read = ReflectUtils.getMethodInfo(getter.getReadMethod()); @@ -168,11 +183,13 @@ abstract public class BeanCopier return setter.getPropertyType().isAssignableFrom(getter.getPropertyType()); } - protected Object firstInstance(Class type) { + @Override + protected Object firstInstance(Class type) { return ReflectUtils.newInstance(type); } - protected Object nextInstance(Object instance) { + @Override + protected Object nextInstance(Object instance) { return instance; } } diff --git a/spring-core/src/main/java/org/springframework/cglib/beans/BeanGenerator.java b/spring-core/src/main/java/org/springframework/cglib/beans/BeanGenerator.java index d4f5e7af9a0..b6b4fb9e7c1 100644 --- a/spring-core/src/main/java/org/springframework/cglib/beans/BeanGenerator.java +++ b/spring-core/src/main/java/org/springframework/cglib/beans/BeanGenerator.java @@ -17,10 +17,18 @@ package org.springframework.cglib.beans; import java.beans.PropertyDescriptor; import java.security.ProtectionDomain; -import java.util.*; -import org.springframework.cglib.core.*; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + import org.springframework.asm.ClassVisitor; import org.springframework.asm.Type; +import org.springframework.cglib.core.AbstractClassGenerator; +import org.springframework.cglib.core.ClassEmitter; +import org.springframework.cglib.core.Constants; +import org.springframework.cglib.core.EmitUtils; +import org.springframework.cglib.core.KeyFactory; +import org.springframework.cglib.core.ReflectUtils; /** * @author Juozas Baliuka, Chris Nokleberg @@ -31,7 +39,7 @@ public class BeanGenerator extends AbstractClassGenerator private static final Source SOURCE = new Source(BeanGenerator.class.getName()); private static final BeanGeneratorKey KEY_FACTORY = (BeanGeneratorKey)KeyFactory.create(BeanGeneratorKey.class); - + interface BeanGeneratorKey { public Object newInstance(String superclass, Map props); } @@ -67,7 +75,8 @@ public class BeanGenerator extends AbstractClassGenerator props.put(name, Type.getType(type)); } - protected ClassLoader getDefaultClassLoader() { + @Override + protected ClassLoader getDefaultClassLoader() { if (superclass != null) { return superclass.getClassLoader(); } else { @@ -75,7 +84,8 @@ public class BeanGenerator extends AbstractClassGenerator } } - protected ProtectionDomain getProtectionDomain() { + @Override + protected ProtectionDomain getProtectionDomain() { return ReflectUtils.getProtectionDomain(superclass); } @@ -98,7 +108,8 @@ public class BeanGenerator extends AbstractClassGenerator return super.create(key); } - public void generateClass(ClassVisitor v) throws Exception { + @Override + public void generateClass(ClassVisitor v) throws Exception { int size = props.size(); String[] names = (String[])props.keySet().toArray(new String[size]); Type[] types = new Type[size]; @@ -117,7 +128,8 @@ public class BeanGenerator extends AbstractClassGenerator ce.end_class(); } - protected Object firstInstance(Class type) { + @Override + protected Object firstInstance(Class type) { if (classOnly) { return type; } else { @@ -125,7 +137,8 @@ public class BeanGenerator extends AbstractClassGenerator } } - protected Object nextInstance(Object instance) { + @Override + protected Object nextInstance(Object instance) { Class protoclass = (instance instanceof Class) ? (Class)instance : instance.getClass(); if (classOnly) { return protoclass; @@ -146,8 +159,8 @@ public class BeanGenerator extends AbstractClassGenerator } public static void addProperties(BeanGenerator gen, PropertyDescriptor[] descriptors) { - for (int i = 0; i < descriptors.length; i++) { - gen.addProperty(descriptors[i].getName(), descriptors[i].getPropertyType()); + for (PropertyDescriptor descriptor : descriptors) { + gen.addProperty(descriptor.getName(), descriptor.getPropertyType()); } } } diff --git a/spring-core/src/main/java/org/springframework/cglib/beans/BeanMap.java b/spring-core/src/main/java/org/springframework/cglib/beans/BeanMap.java index 12731c67178..77a73326e61 100644 --- a/spring-core/src/main/java/org/springframework/cglib/beans/BeanMap.java +++ b/spring-core/src/main/java/org/springframework/cglib/beans/BeanMap.java @@ -54,7 +54,7 @@ abstract public class BeanMap implements Map { * @see BeanMap.Generator#setRequire */ public static final int REQUIRE_SETTER = 2; - + /** * Helper method to create a new BeanMap. For finer * control over the generated instance, use a new instance of @@ -77,11 +77,11 @@ abstract public class BeanMap implements Map { interface BeanMapKey { public Object newInstance(Class type, int require); } - + private Object bean; private Class beanClass; private int require; - + public Generator() { super(SOURCE); } @@ -121,11 +121,13 @@ abstract public class BeanMap implements Map { this.require = require; } - protected ClassLoader getDefaultClassLoader() { + @Override + protected ClassLoader getDefaultClassLoader() { return beanClass.getClassLoader(); } - protected ProtectionDomain getProtectionDomain() { + @Override + protected ProtectionDomain getProtectionDomain() { return ReflectUtils.getProtectionDomain(beanClass); } @@ -134,21 +136,25 @@ abstract public class BeanMap implements Map { * generated class will be reused if possible. */ public BeanMap create() { - if (beanClass == null) - throw new IllegalArgumentException("Class of bean unknown"); + if (beanClass == null) { + throw new IllegalArgumentException("Class of bean unknown"); + } setNamePrefix(beanClass.getName()); return (BeanMap)super.create(KEY_FACTORY.newInstance(beanClass, require)); } - public void generateClass(ClassVisitor v) throws Exception { + @Override + public void generateClass(ClassVisitor v) throws Exception { new BeanMapEmitter(v, getClassName(), beanClass, require); } - protected Object firstInstance(Class type) { + @Override + protected Object firstInstance(Class type) { return ((BeanMap)ReflectUtils.newInstance(type)).newInstance(bean); } - protected Object nextInstance(Object instance) { + @Override + protected Object nextInstance(Object instance) { return ((BeanMap)instance).newInstance(bean); } } @@ -177,11 +183,13 @@ abstract public class BeanMap implements Map { setBean(bean); } - public Object get(Object key) { + @Override + public Object get(Object key) { return get(bean, key); } - public Object put(Object key, Object value) { + @Override + public Object put(Object key, Object value) { return put(bean, key, value); } @@ -223,52 +231,58 @@ abstract public class BeanMap implements Map { return bean; } - public void clear() { + @Override + public void clear() { throw new UnsupportedOperationException(); } - public boolean containsKey(Object key) { + @Override + public boolean containsKey(Object key) { return keySet().contains(key); } - public boolean containsValue(Object value) { + @Override + public boolean containsValue(Object value) { for (Iterator it = keySet().iterator(); it.hasNext();) { Object v = get(it.next()); - if (((value == null) && (v == null)) || (value != null && value.equals(v))) - return true; + if (((value == null) && (v == null)) || (value != null && value.equals(v))) { + return true; + } } return false; } - public int size() { + @Override + public int size() { return keySet().size(); } - public boolean isEmpty() { + @Override + public boolean isEmpty() { return size() == 0; } - public Object remove(Object key) { + @Override + public Object remove(Object key) { throw new UnsupportedOperationException(); } - public void putAll(Map t) { - for (Iterator it = t.keySet().iterator(); it.hasNext();) { - Object key = it.next(); + @Override + public void putAll(Map t) { + for (Object key : t.keySet()) { put(key, t.get(key)); } } - public boolean equals(Object o) { - if (o == null || !(o instanceof Map)) { + @Override + public boolean equals(Object o) { + if (o == null || !(o instanceof Map other)) { return false; } - Map other = (Map)o; if (size() != other.size()) { return false; } - for (Iterator it = keySet().iterator(); it.hasNext();) { - Object key = it.next(); + for (Object key : keySet()) { if (!other.containsKey(key)) { return false; } @@ -281,10 +295,10 @@ abstract public class BeanMap implements Map { return true; } - public int hashCode() { + @Override + public int hashCode() { int code = 0; - for (Iterator it = keySet().iterator(); it.hasNext();) { - Object key = it.next(); + for (Object key : keySet()) { Object value = get(key); code += ((key == null) ? 0 : key.hashCode()) ^ ((value == null) ? 0 : value.hashCode()); @@ -293,16 +307,17 @@ abstract public class BeanMap implements Map { } // TODO: optimize - public Set entrySet() { + @Override + public Set entrySet() { HashMap copy = new HashMap(); - for (Iterator it = keySet().iterator(); it.hasNext();) { - Object key = it.next(); + for (Object key : keySet()) { copy.put(key, get(key)); } return Collections.unmodifiableMap(copy).entrySet(); } - public Collection values() { + @Override + public Collection values() { Set keys = keySet(); List values = new ArrayList(keys.size()); for (Iterator it = keys.iterator(); it.hasNext();) { @@ -314,7 +329,8 @@ abstract public class BeanMap implements Map { /* * @see java.util.AbstractMap#toString */ - public String toString() + @Override + public String toString() { StringBuilder sb = new StringBuilder(); sb.append('{'); diff --git a/spring-core/src/main/java/org/springframework/cglib/beans/BeanMapEmitter.java b/spring-core/src/main/java/org/springframework/cglib/beans/BeanMapEmitter.java index 986aa02fd61..b1e3596f8ff 100644 --- a/spring-core/src/main/java/org/springframework/cglib/beans/BeanMapEmitter.java +++ b/spring-core/src/main/java/org/springframework/cglib/beans/BeanMapEmitter.java @@ -15,12 +15,23 @@ */ package org.springframework.cglib.beans; -import java.beans.*; -import java.util.*; -import org.springframework.cglib.core.*; +import java.beans.PropertyDescriptor; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + import org.springframework.asm.ClassVisitor; import org.springframework.asm.Label; import org.springframework.asm.Type; +import org.springframework.cglib.core.ClassEmitter; +import org.springframework.cglib.core.CodeEmitter; +import org.springframework.cglib.core.Constants; +import org.springframework.cglib.core.EmitUtils; +import org.springframework.cglib.core.MethodInfo; +import org.springframework.cglib.core.ObjectSwitchCallback; +import org.springframework.cglib.core.ReflectUtils; +import org.springframework.cglib.core.Signature; +import org.springframework.cglib.core.TypeUtils; @SuppressWarnings({"rawtypes", "unchecked"}) class BeanMapEmitter extends ClassEmitter { @@ -50,7 +61,7 @@ class BeanMapEmitter extends ClassEmitter { EmitUtils.null_constructor(this); EmitUtils.factory_method(this, NEW_INSTANCE); generateConstructor(); - + Map getters = makePropertyMap(ReflectUtils.getBeanGetters(type)); Map setters = makePropertyMap(ReflectUtils.getBeanSetters(type)); Map allProps = new HashMap(); @@ -79,8 +90,8 @@ class BeanMapEmitter extends ClassEmitter { private Map makePropertyMap(PropertyDescriptor[] props) { Map names = new HashMap(); - for (int i = 0; i < props.length; i++) { - names.put(props[i].getName(), props[i]); + for (PropertyDescriptor prop : props) { + names.put(prop.getName(), prop); } return names; } @@ -97,7 +108,7 @@ class BeanMapEmitter extends ClassEmitter { e.return_value(); e.end_method(); } - + private void generateGet(Class type, final Map getters) { final CodeEmitter e = begin_method(Constants.ACC_PUBLIC, BEAN_MAP_GET, null); e.load_arg(0); @@ -105,14 +116,16 @@ class BeanMapEmitter extends ClassEmitter { e.load_arg(1); e.checkcast(Constants.TYPE_STRING); EmitUtils.string_switch(e, getNames(getters), Constants.SWITCH_STYLE_HASH, new ObjectSwitchCallback() { - public void processCase(Object key, Label end) { + @Override + public void processCase(Object key, Label end) { PropertyDescriptor pd = (PropertyDescriptor)getters.get(key); MethodInfo method = ReflectUtils.getMethodInfo(pd.getReadMethod()); e.invoke(method); e.box(method.getSignature().getReturnType()); e.return_value(); } - public void processDefault() { + @Override + public void processDefault() { e.aconst_null(); e.return_value(); } @@ -127,7 +140,8 @@ class BeanMapEmitter extends ClassEmitter { e.load_arg(1); e.checkcast(Constants.TYPE_STRING); EmitUtils.string_switch(e, getNames(setters), Constants.SWITCH_STYLE_HASH, new ObjectSwitchCallback() { - public void processCase(Object key, Label end) { + @Override + public void processCase(Object key, Label end) { PropertyDescriptor pd = (PropertyDescriptor)setters.get(key); if (pd.getReadMethod() == null) { e.aconst_null(); @@ -144,7 +158,8 @@ class BeanMapEmitter extends ClassEmitter { e.invoke(write); e.return_value(); } - public void processDefault() { + @Override + public void processDefault() { // fall-through } }); @@ -152,7 +167,7 @@ class BeanMapEmitter extends ClassEmitter { e.return_value(); e.end_method(); } - + private void generateKeySet(String[] allNames) { // static initializer declare_field(Constants.ACC_STATIC | Constants.ACC_PRIVATE, "keys", FIXED_KEY_SET, null); @@ -178,12 +193,14 @@ class BeanMapEmitter extends ClassEmitter { final CodeEmitter e = begin_method(Constants.ACC_PUBLIC, GET_PROPERTY_TYPE, null); e.load_arg(0); EmitUtils.string_switch(e, allNames, Constants.SWITCH_STYLE_HASH, new ObjectSwitchCallback() { - public void processCase(Object key, Label end) { + @Override + public void processCase(Object key, Label end) { PropertyDescriptor pd = (PropertyDescriptor)allProps.get(key); EmitUtils.load_class(e, Type.getType(pd.getPropertyType())); e.return_value(); } - public void processDefault() { + @Override + public void processDefault() { e.aconst_null(); e.return_value(); } diff --git a/spring-core/src/main/java/org/springframework/cglib/beans/BulkBean.java b/spring-core/src/main/java/org/springframework/cglib/beans/BulkBean.java index 7fdd702dbdc..582df3be532 100644 --- a/spring-core/src/main/java/org/springframework/cglib/beans/BulkBean.java +++ b/spring-core/src/main/java/org/springframework/cglib/beans/BulkBean.java @@ -16,8 +16,11 @@ package org.springframework.cglib.beans; import java.security.ProtectionDomain; -import org.springframework.cglib.core.*; + import org.springframework.asm.ClassVisitor; +import org.springframework.cglib.core.AbstractClassGenerator; +import org.springframework.cglib.core.KeyFactory; +import org.springframework.cglib.core.ReflectUtils; /** * @author Juozas Baliuka @@ -27,17 +30,17 @@ abstract public class BulkBean { private static final BulkBeanKey KEY_FACTORY = (BulkBeanKey)KeyFactory.create(BulkBeanKey.class); - + interface BulkBeanKey { public Object newInstance(String target, String[] getters, String[] setters, String[] types); } - + protected Class target; protected String[] getters, setters; protected Class[] types; - + protected BulkBean() { } - + abstract public void getPropertyValues(Object bean, Object[] values); abstract public void setPropertyValues(Object bean, Object[] values); @@ -46,15 +49,15 @@ abstract public class BulkBean getPropertyValues(bean, values); return values; } - + public Class[] getPropertyTypes() { return types.clone(); } - + public String[] getGetters() { return getters.clone(); } - + public String[] getSetters() { return setters.clone(); } @@ -98,11 +101,13 @@ abstract public class BulkBean this.types = types; } - protected ClassLoader getDefaultClassLoader() { + @Override + protected ClassLoader getDefaultClassLoader() { return target.getClassLoader(); } - protected ProtectionDomain getProtectionDomain() { + @Override + protected ProtectionDomain getProtectionDomain() { return ReflectUtils.getProtectionDomain(target); } @@ -114,28 +119,31 @@ abstract public class BulkBean return (BulkBean)super.create(key); } - public void generateClass(ClassVisitor v) throws Exception { + @Override + public void generateClass(ClassVisitor v) throws Exception { new BulkBeanEmitter(v, getClassName(), target, getters, setters, types); } - protected Object firstInstance(Class type) { + @Override + protected Object firstInstance(Class type) { BulkBean instance = (BulkBean)ReflectUtils.newInstance(type); instance.target = target; - + int length = getters.length; instance.getters = new String[length]; System.arraycopy(getters, 0, instance.getters, 0, length); - + instance.setters = new String[length]; System.arraycopy(setters, 0, instance.setters, 0, length); - + instance.types = new Class[types.length]; System.arraycopy(types, 0, instance.types, 0, types.length); return instance; } - protected Object nextInstance(Object instance) { + @Override + protected Object nextInstance(Object instance) { return instance; } } diff --git a/spring-core/src/main/java/org/springframework/cglib/beans/BulkBeanEmitter.java b/spring-core/src/main/java/org/springframework/cglib/beans/BulkBeanEmitter.java index 9502c3fa88a..8a6198f4c51 100644 --- a/spring-core/src/main/java/org/springframework/cglib/beans/BulkBeanEmitter.java +++ b/spring-core/src/main/java/org/springframework/cglib/beans/BulkBeanEmitter.java @@ -17,9 +17,19 @@ package org.springframework.cglib.beans; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import org.springframework.cglib.core.*; + import org.springframework.asm.ClassVisitor; import org.springframework.asm.Type; +import org.springframework.cglib.core.Block; +import org.springframework.cglib.core.ClassEmitter; +import org.springframework.cglib.core.CodeEmitter; +import org.springframework.cglib.core.Constants; +import org.springframework.cglib.core.EmitUtils; +import org.springframework.cglib.core.Local; +import org.springframework.cglib.core.MethodInfo; +import org.springframework.cglib.core.ReflectUtils; +import org.springframework.cglib.core.Signature; +import org.springframework.cglib.core.TypeUtils; @SuppressWarnings({"rawtypes", "unchecked"}) class BulkBeanEmitter extends ClassEmitter { @@ -33,7 +43,7 @@ class BulkBeanEmitter extends ClassEmitter { TypeUtils.parseType("org.springframework.cglib.beans.BulkBean"); private static final Type BULK_BEAN_EXCEPTION = TypeUtils.parseType("org.springframework.cglib.beans.BulkBeanException"); - + public BulkBeanEmitter(ClassVisitor v, String className, Class target, @@ -116,7 +126,7 @@ class BulkBeanEmitter extends ClassEmitter { } e.end_method(); } - + private static void validate(Class target, String[] getters, String[] setters, diff --git a/spring-core/src/main/java/org/springframework/cglib/beans/BulkBeanException.java b/spring-core/src/main/java/org/springframework/cglib/beans/BulkBeanException.java index 20887f93832..7325fdebee9 100644 --- a/spring-core/src/main/java/org/springframework/cglib/beans/BulkBeanException.java +++ b/spring-core/src/main/java/org/springframework/cglib/beans/BulkBeanException.java @@ -20,7 +20,7 @@ public class BulkBeanException extends RuntimeException { private int index; private Throwable cause; - + public BulkBeanException(String message, int index) { super(message); this.index = index; @@ -35,8 +35,9 @@ public class BulkBeanException extends RuntimeException public int getIndex() { return index; } - - public Throwable getCause() { + + @Override + public Throwable getCause() { return cause; } } diff --git a/spring-core/src/main/java/org/springframework/cglib/beans/FixedKeySet.java b/spring-core/src/main/java/org/springframework/cglib/beans/FixedKeySet.java index 399da30ee5b..92b32efe8cb 100644 --- a/spring-core/src/main/java/org/springframework/cglib/beans/FixedKeySet.java +++ b/spring-core/src/main/java/org/springframework/cglib/beans/FixedKeySet.java @@ -15,7 +15,12 @@ */ package org.springframework.cglib.beans; -import java.util.*; +import java.util.AbstractSet; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; @SuppressWarnings({"rawtypes", "unchecked"}) public /* need it for class loading */ class FixedKeySet extends AbstractSet { @@ -27,11 +32,13 @@ public /* need it for class loading */ class FixedKeySet extends AbstractSet { set = Collections.unmodifiableSet(new HashSet(Arrays.asList(keys))); } - public Iterator iterator() { + @Override + public Iterator iterator() { return set.iterator(); } - public int size() { + @Override + public int size() { return size; } } diff --git a/spring-core/src/main/java/org/springframework/cglib/beans/ImmutableBean.java b/spring-core/src/main/java/org/springframework/cglib/beans/ImmutableBean.java index dfc03594228..aa62b7a43b2 100644 --- a/spring-core/src/main/java/org/springframework/cglib/beans/ImmutableBean.java +++ b/spring-core/src/main/java/org/springframework/cglib/beans/ImmutableBean.java @@ -18,9 +18,18 @@ package org.springframework.cglib.beans; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import java.security.ProtectionDomain; -import org.springframework.cglib.core.*; + import org.springframework.asm.ClassVisitor; import org.springframework.asm.Type; +import org.springframework.cglib.core.AbstractClassGenerator; +import org.springframework.cglib.core.ClassEmitter; +import org.springframework.cglib.core.CodeEmitter; +import org.springframework.cglib.core.Constants; +import org.springframework.cglib.core.EmitUtils; +import org.springframework.cglib.core.MethodInfo; +import org.springframework.cglib.core.ReflectUtils; +import org.springframework.cglib.core.Signature; +import org.springframework.cglib.core.TypeUtils; /** * @author Chris Nokleberg */ @@ -60,11 +69,13 @@ public class ImmutableBean // SPRING PATCH END } - protected ClassLoader getDefaultClassLoader() { + @Override + protected ClassLoader getDefaultClassLoader() { return target.getClassLoader(); } - protected ProtectionDomain getProtectionDomain() { + @Override + protected ProtectionDomain getProtectionDomain() { return ReflectUtils.getProtectionDomain(target); } @@ -74,7 +85,8 @@ public class ImmutableBean return super.create(name); } - public void generateClass(ClassVisitor v) { + @Override + public void generateClass(ClassVisitor v) { Type targetType = Type.getType(target); ClassEmitter ce = new ClassEmitter(v); ce.begin_class(Constants.V1_8, @@ -100,8 +112,8 @@ public class ImmutableBean Method[] getters = ReflectUtils.getPropertyMethods(descriptors, true, false); Method[] setters = ReflectUtils.getPropertyMethods(descriptors, false, true); - for (int i = 0; i < getters.length; i++) { - MethodInfo getter = ReflectUtils.getMethodInfo(getters[i]); + for (Method getter2 : getters) { + MethodInfo getter = ReflectUtils.getMethodInfo(getter2); e = EmitUtils.begin_method(ce, getter, Constants.ACC_PUBLIC); e.load_this(); e.getfield(FIELD_NAME); @@ -110,8 +122,8 @@ public class ImmutableBean e.end_method(); } - for (int i = 0; i < setters.length; i++) { - MethodInfo setter = ReflectUtils.getMethodInfo(setters[i]); + for (Method setter2 : setters) { + MethodInfo setter = ReflectUtils.getMethodInfo(setter2); e = EmitUtils.begin_method(ce, setter, Constants.ACC_PUBLIC); e.throw_exception(ILLEGAL_STATE_EXCEPTION, "Bean is immutable"); e.end_method(); @@ -120,12 +132,14 @@ public class ImmutableBean ce.end_class(); } - protected Object firstInstance(Class type) { + @Override + protected Object firstInstance(Class type) { return ReflectUtils.newInstance(type, OBJECT_CLASSES, new Object[]{ bean }); } // TODO: optimize - protected Object nextInstance(Object instance) { + @Override + protected Object nextInstance(Object instance) { return firstInstance(instance.getClass()); } } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/AbstractClassGenerator.java b/spring-core/src/main/java/org/springframework/cglib/core/AbstractClassGenerator.java index e2d23d1d070..9196cdf1b91 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/AbstractClassGenerator.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/AbstractClassGenerator.java @@ -38,7 +38,7 @@ abstract public class AbstractClassGenerator implements ClassGenerator { private static final ThreadLocal CURRENT = new ThreadLocal(); - private static volatile Map CACHE = new WeakHashMap(); + private static volatile Map CACHE = new WeakHashMap<>(); private static final boolean DEFAULT_USE_CACHE = Boolean.parseBoolean(System.getProperty("cglib.useCache", "true")); @@ -70,7 +70,7 @@ abstract public class AbstractClassGenerator implements ClassGenerator { protected static class ClassLoaderData { - private final Set reservedClassNames = new HashSet(); + private final Set reservedClassNames = new HashSet<>(); /** * {@link AbstractClassGenerator} here holds "cache key" (e.g. {@link org.springframework.cglib.proxy.Enhancer} @@ -90,31 +90,20 @@ abstract public class AbstractClassGenerator implements ClassGenerator { */ private final WeakReference classLoader; - private final Predicate uniqueNamePredicate = new Predicate() { - public boolean evaluate(Object name) { - return reservedClassNames.contains(name); - } - }; + private final Predicate uniqueNamePredicate = this.reservedClassNames::contains; - private static final Function GET_KEY = new Function() { - public Object apply(AbstractClassGenerator gen) { - return gen.key; - } - }; + private static final Function GET_KEY = gen -> gen.key; public ClassLoaderData(ClassLoader classLoader) { if (classLoader == null) { throw new IllegalArgumentException("classLoader == null is not yet supported"); } - this.classLoader = new WeakReference(classLoader); - Function load = - new Function() { - public Object apply(AbstractClassGenerator gen) { - Class klass = gen.generate(ClassLoaderData.this); - return gen.wrapCachedClass(klass); - } - }; - generatedClasses = new LoadingCache(GET_KEY, load); + this.classLoader = new WeakReference<>(classLoader); + Function load = gen -> { + Class klass = gen.generate(ClassLoaderData.this); + return gen.wrapCachedClass(klass); + }; + generatedClasses = new LoadingCache<>(GET_KEY, load); } public ClassLoader getClassLoader() { @@ -205,8 +194,9 @@ abstract public class AbstractClassGenerator implements ClassGenerator { * @see DefaultNamingPolicy */ public void setNamingPolicy(NamingPolicy namingPolicy) { - if (namingPolicy == null) + if (namingPolicy == null) { namingPolicy = DefaultNamingPolicy.INSTANCE; + } this.namingPolicy = namingPolicy; } @@ -250,8 +240,9 @@ abstract public class AbstractClassGenerator implements ClassGenerator { * By default an instance of {@link DefaultGeneratorStrategy} is used. */ public void setStrategy(GeneratorStrategy strategy) { - if (strategy == null) + if (strategy == null) { strategy = DefaultGeneratorStrategy.INSTANCE; + } this.strategy = strategy; } @@ -311,7 +302,7 @@ abstract public class AbstractClassGenerator implements ClassGenerator { cache = CACHE; data = cache.get(loader); if (data == null) { - Map newCache = new WeakHashMap(cache); + Map newCache = new WeakHashMap<>(cache); data = new ClassLoaderData(loader); newCache.put(loader, data); CACHE = newCache; @@ -320,8 +311,8 @@ abstract public class AbstractClassGenerator implements ClassGenerator { } this.key = key; Object obj = data.get(this, getUseCache()); - if (obj instanceof Class) { - return firstInstance((Class) obj); + if (obj instanceof Class clazz) { + return firstInstance(clazz); } return nextInstance(obj); } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/Block.java b/spring-core/src/main/java/org/springframework/cglib/core/Block.java index f9837a12eb5..3e92ebe1db9 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/Block.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/Block.java @@ -38,7 +38,7 @@ public class Block } end = e.mark(); } - + public Label getStart() { return start; } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/ClassEmitter.java b/spring-core/src/main/java/org/springframework/cglib/core/ClassEmitter.java index dbe7f3dce4e..6f91692e040 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/ClassEmitter.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/ClassEmitter.java @@ -15,14 +15,14 @@ */ package org.springframework.cglib.core; +import java.util.HashMap; +import java.util.Map; + import org.springframework.asm.ClassVisitor; import org.springframework.asm.FieldVisitor; import org.springframework.asm.MethodVisitor; import org.springframework.asm.Type; -import java.util.HashMap; -import java.util.Map; - /** * @author Juozas Baliuka, Chris Nokleberg */ @@ -45,7 +45,8 @@ public class ClassEmitter extends ClassTransformer { super(Constants.ASM_API); } - public void setTarget(ClassVisitor cv) { + @Override + public void setTarget(ClassVisitor cv) { this.cv = cv; fieldInfo = new HashMap(); @@ -65,16 +66,20 @@ public class ClassEmitter extends ClassTransformer { public void begin_class(int version, final int access, String className, final Type superType, final Type[] interfaces, String source) { final Type classType = Type.getType("L" + className.replace('.', '/') + ";"); classInfo = new ClassInfo() { - public Type getType() { + @Override + public Type getType() { return classType; } - public Type getSuperType() { + @Override + public Type getSuperType() { return (superType != null) ? superType : Constants.TYPE_OBJECT; } - public Type[] getInterfaces() { + @Override + public Type[] getInterfaces() { return interfaces; } - public int getModifiers() { + @Override + public int getModifiers() { return access; } }; @@ -84,8 +89,9 @@ public class ClassEmitter extends ClassTransformer { null, classInfo.getSuperType().getInternalName(), TypeUtils.toInternalNames(interfaces)); - if (source != null) - cv.visitSource(source, null); + if (source != null) { + cv.visitSource(source, null); + } init(); } @@ -137,8 +143,9 @@ public class ClassEmitter extends ClassTransformer { } public CodeEmitter begin_method(int access, Signature sig, Type[] exceptions) { - if (classInfo == null) - throw new IllegalStateException("classInfo is null! " + this); + if (classInfo == null) { + throw new IllegalStateException("classInfo is null! " + this); + } MethodVisitor v = cv.visitMethod(access, sig.getName(), sig.getDescriptor(), @@ -147,10 +154,12 @@ public class ClassEmitter extends ClassTransformer { if (sig.equals(Constants.SIG_STATIC) && !TypeUtils.isInterface(getAccess())) { rawStaticInit = v; MethodVisitor wrapped = new MethodVisitor(Constants.ASM_API, v) { - public void visitMaxs(int maxStack, int maxLocals) { + @Override + public void visitMaxs(int maxStack, int maxLocals) { // ignore } - public void visitInsn(int insn) { + @Override + public void visitInsn(int insn) { if (insn != Constants.RETURN) { super.visitInsn(insn); } @@ -166,7 +175,8 @@ public class ClassEmitter extends ClassTransformer { return staticInit; } else if (sig.equals(staticHookSig)) { return new CodeEmitter(this, v, access, sig, exceptions) { - public boolean isStaticHook() { + @Override + public boolean isStaticHook() { return true; } }; @@ -204,13 +214,13 @@ public class ClassEmitter extends ClassTransformer { } return field; } - + static class FieldInfo { int access; String name; Type type; Object value; - + public FieldInfo(int access, String name, Type type, Object value) { this.access = access; this.name = name; @@ -218,30 +228,36 @@ public class ClassEmitter extends ClassTransformer { this.value = value; } - public boolean equals(Object o) { - if (o == null) - return false; - if (!(o instanceof FieldInfo)) - return false; - FieldInfo other = (FieldInfo)o; + @Override + public boolean equals(Object o) { + if (o == null) { + return false; + } + if (!(o instanceof FieldInfo other)) { + return false; + } if (access != other.access || !name.equals(other.name) || !type.equals(other.type)) { return false; } - if ((value == null) ^ (other.value == null)) - return false; - if (value != null && !value.equals(other.value)) - return false; + if ((value == null) ^ (other.value == null)) { + return false; + } + if (value != null && !value.equals(other.value)) { + return false; + } return true; } - public int hashCode() { + @Override + public int hashCode() { return access ^ name.hashCode() ^ type.hashCode() ^ ((value == null) ? 0 : value.hashCode()); } } - public void visit(int version, + @Override + public void visit(int version, int access, String name, String signature, @@ -254,12 +270,14 @@ public class ClassEmitter extends ClassTransformer { TypeUtils.fromInternalNames(interfaces), null); // TODO } - - public void visitEnd() { + + @Override + public void visitEnd() { end_class(); } - - public FieldVisitor visitField(int access, + + @Override + public FieldVisitor visitField(int access, String name, String desc, String signature, @@ -267,14 +285,15 @@ public class ClassEmitter extends ClassTransformer { declare_field(access, name, Type.getType(desc), value); return null; // TODO } - - public MethodVisitor visitMethod(int access, + + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { return begin_method(access, new Signature(name, desc), - TypeUtils.fromInternalNames(exceptions)); + TypeUtils.fromInternalNames(exceptions)); } } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/ClassInfo.java b/spring-core/src/main/java/org/springframework/cglib/core/ClassInfo.java index afe16470ab1..856e025bc05 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/ClassInfo.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/ClassInfo.java @@ -28,14 +28,16 @@ abstract public class ClassInfo { abstract public Type[] getInterfaces(); abstract public int getModifiers(); - @Override - public boolean equals(Object o) { - if (o == null) - return false; - if (!(o instanceof ClassInfo)) - return false; - return getType().equals(((ClassInfo)o).getType()); - } + @Override + public boolean equals(Object o) { + if (o == null) { + return false; + } + if (!(o instanceof ClassInfo classInfo)) { + return false; + } + return getType().equals(classInfo.getType()); + } @Override public int hashCode() { diff --git a/spring-core/src/main/java/org/springframework/cglib/core/ClassNameReader.java b/spring-core/src/main/java/org/springframework/cglib/core/ClassNameReader.java index e930032cf39..4371fcdc3a4 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/ClassNameReader.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/ClassNameReader.java @@ -15,51 +15,53 @@ */ package org.springframework.cglib.core; +import java.util.ArrayList; +import java.util.List; + import org.springframework.asm.ClassReader; import org.springframework.asm.ClassVisitor; -import java.util.*; - // TODO: optimize (ClassReader buffers entire class before accept) @SuppressWarnings({"rawtypes", "unchecked"}) public class ClassNameReader { - private ClassNameReader() { - } - private static final EarlyExitException EARLY_EXIT = new EarlyExitException(); + private ClassNameReader() { + } + + private static final EarlyExitException EARLY_EXIT = new EarlyExitException(); @SuppressWarnings("serial") - private static class EarlyExitException extends RuntimeException { } - - public static String getClassName(ClassReader r) { - - return getClassInfo(r)[0]; - - } - + private static class EarlyExitException extends RuntimeException { + } + + public static String getClassName(ClassReader r) { + return getClassInfo(r)[0]; + } + public static String[] getClassInfo(ClassReader r) { - final List array = new ArrayList(); + final List array = new ArrayList<>(); try { r.accept(new ClassVisitor(Constants.ASM_API, null) { + @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { - array.add( name.replace('/', '.') ); - if(superName != null){ - array.add( superName.replace('/', '.') ); + array.add(name.replace('/', '.')); + if (superName != null) { + array.add(superName.replace('/', '.')); } - for(int i = 0; i < interfaces.length; i++ ){ - array.add( interfaces[i].replace('/', '.') ); + for (String element : interfaces) { + array.add(element.replace('/', '.')); } - + throw EARLY_EXIT; } }, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); } catch (EarlyExitException e) { } - - return (String[])array.toArray( new String[]{} ); + + return array.toArray(new String[0]); } } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/ClassesKey.java b/spring-core/src/main/java/org/springframework/cglib/core/ClassesKey.java index 64f7239ece2..338a2c1a6f2 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/ClassesKey.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/ClassesKey.java @@ -17,7 +17,7 @@ package org.springframework.cglib.core; public class ClassesKey { private static final Key FACTORY = (Key)KeyFactory.create(Key.class); - + interface Key { Object newInstance(Object[] array); } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/CodeEmitter.java b/spring-core/src/main/java/org/springframework/cglib/core/CodeEmitter.java index 68c5336abe7..a7080055a63 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/CodeEmitter.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/CodeEmitter.java @@ -613,8 +613,9 @@ public class CodeEmitter extends LocalVariablesSorter { } public void process_switch(int[] keys, ProcessSwitchCallback callback, boolean useTable) { - if (!isSorted(keys)) - throw new IllegalArgumentException("keys to switch must be sorted ascending"); + if (!isSorted(keys)) { + throw new IllegalArgumentException("keys to switch must be sorted ascending"); + } Label def = make_label(); Label end = make_label(); @@ -656,9 +657,7 @@ public class CodeEmitter extends LocalVariablesSorter { callback.processDefault(); mark(end); - } catch (RuntimeException e) { - throw e; - } catch (Error e) { + } catch (RuntimeException | Error e) { throw e; } catch (Exception e) { throw new CodeGenerationException(e); @@ -667,8 +666,9 @@ public class CodeEmitter extends LocalVariablesSorter { private static boolean isSorted(int[] keys) { for (int i = 1; i < keys.length; i++) { - if (keys[i] < keys[i - 1]) - return false; + if (keys[i] < keys[i - 1]) { + return false; + } } return true; } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/CodeGenerationException.java b/spring-core/src/main/java/org/springframework/cglib/core/CodeGenerationException.java index 48b3495a50a..ccbd34fb83a 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/CodeGenerationException.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/CodeGenerationException.java @@ -27,7 +27,8 @@ public class CodeGenerationException extends RuntimeException { this.cause = cause; } - public Throwable getCause() { + @Override + public Throwable getCause() { return cause; } } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/CollectionUtils.java b/spring-core/src/main/java/org/springframework/cglib/core/CollectionUtils.java index 49fe4f174c0..1590cad0779 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/CollectionUtils.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/CollectionUtils.java @@ -34,8 +34,7 @@ public class CollectionUtils { public static Map bucket(Collection c, Transformer t) { Map buckets = new HashMap(); - for (Iterator it = c.iterator(); it.hasNext();) { - Object value = it.next(); + for (Object value : c) { Object key = t.transform(value); List bucket = (List)buckets.get(key); if (bucket == null) { @@ -47,8 +46,7 @@ public class CollectionUtils { } public static void reverse(Map source, Map target) { - for (Iterator it = source.keySet().iterator(); it.hasNext();) { - Object key = it.next(); + for (Object key : source.keySet()) { target.put(source.get(key), key); } } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/Constants.java b/spring-core/src/main/java/org/springframework/cglib/core/Constants.java index 1fa8e2e3ccd..577387a118a 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/Constants.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/Constants.java @@ -32,7 +32,7 @@ public interface Constants extends org.springframework.asm.Opcodes { public static final Signature SIG_STATIC = TypeUtils.parseSignature("void ()"); - + public static final Type TYPE_OBJECT_ARRAY = TypeUtils.parseType("Object[]"); public static final Type TYPE_CLASS_ARRAY = TypeUtils.parseType("Class[]"); public static final Type TYPE_STRING_ARRAY = TypeUtils.parseType("String[]"); diff --git a/spring-core/src/main/java/org/springframework/cglib/core/DefaultGeneratorStrategy.java b/spring-core/src/main/java/org/springframework/cglib/core/DefaultGeneratorStrategy.java index 27607cf74b2..ad72b4450b3 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/DefaultGeneratorStrategy.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/DefaultGeneratorStrategy.java @@ -19,8 +19,9 @@ import org.springframework.asm.ClassWriter; public class DefaultGeneratorStrategy implements GeneratorStrategy { public static final DefaultGeneratorStrategy INSTANCE = new DefaultGeneratorStrategy(); - - public byte[] generate(ClassGenerator cg) throws Exception { + + @Override + public byte[] generate(ClassGenerator cg) throws Exception { DebuggingClassWriter cw = getClassVisitor(); transform(cg).generateClass(cw); return transform(cw.toByteArray()); @@ -36,7 +37,7 @@ public class DefaultGeneratorStrategy implements GeneratorStrategy { throw new UnsupportedOperationException("You are calling " + "getClassWriter, which no longer exists in this cglib version."); } - + protected byte[] transform(byte[] b) throws Exception { return b; } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/DefaultNamingPolicy.java b/spring-core/src/main/java/org/springframework/cglib/core/DefaultNamingPolicy.java index 0efb6201274..9020e490abd 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/DefaultNamingPolicy.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/DefaultNamingPolicy.java @@ -48,8 +48,9 @@ public class DefaultNamingPolicy implements NamingPolicy { Integer.toHexString(STRESS_HASH_CODE ? 0 : key.hashCode()); String attempt = base; int index = 2; - while (names.evaluate(attempt)) - attempt = base + "_" + index++; + while (names.evaluate(attempt)) { + attempt = base + "_" + index++; + } return attempt; } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/DuplicatesPredicate.java b/spring-core/src/main/java/org/springframework/cglib/core/DuplicatesPredicate.java index a12cf1ce62f..23d843411fe 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/DuplicatesPredicate.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/DuplicatesPredicate.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.cglib.core; import java.io.IOException; @@ -24,6 +25,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; + import org.springframework.asm.ClassReader; import org.springframework.asm.ClassVisitor; import org.springframework.asm.MethodVisitor; @@ -45,7 +47,7 @@ public class DuplicatesPredicate implements Predicate { /** * Constructs a DuplicatesPredicate that prefers using superclass non-bridge methods despite a - * subclass method with the same signtaure existing (if the subclass is a bridge method). + * subclass method with the same signature existing (if the subclass is a bridge method). */ public DuplicatesPredicate(List allMethods) { rejected = new HashSet(); @@ -70,7 +72,7 @@ public class DuplicatesPredicate implements Predicate { suspects.put(sig, existing); } } - + if (!suspects.isEmpty()) { Set classes = new HashSet(); UnnecessaryBridgeFinder finder = new UnnecessaryBridgeFinder(rejected); @@ -101,10 +103,11 @@ public class DuplicatesPredicate implements Predicate { } } + @Override public boolean evaluate(Object arg) { return !rejected.contains(arg) && unique.add(MethodWrapper.create((Method) arg)); } - + private static ClassLoader getClassLoader(Class c) { ClassLoader cl = c.getClassLoader(); if (cl == null) { @@ -131,6 +134,7 @@ public class DuplicatesPredicate implements Predicate { methods.put(ReflectUtils.getSignature(m), m); } + @Override public void visit( int version, int access, @@ -139,6 +143,7 @@ public class DuplicatesPredicate implements Predicate { String superName, String[] interfaces) {} + @Override public MethodVisitor visitMethod( int access, String name, String desc, String signature, String[] exceptions) { Signature sig = new Signature(name, desc); @@ -146,6 +151,7 @@ public class DuplicatesPredicate implements Predicate { if (currentMethod != null) { currentMethodSig = sig; return new MethodVisitor(Constants.ASM_API) { + @Override public void visitMethodInsn( int opcode, String owner, String name, String desc, boolean itf) { if (opcode == Opcodes.INVOKESPECIAL && currentMethodSig != null) { diff --git a/spring-core/src/main/java/org/springframework/cglib/core/EmitUtils.java b/spring-core/src/main/java/org/springframework/cglib/core/EmitUtils.java index 36522a16027..822f38d5e8b 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/EmitUtils.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/EmitUtils.java @@ -187,9 +187,7 @@ public class EmitUtils { default: throw new IllegalArgumentException("unknown switch style " + switchStyle); } - } catch (RuntimeException ex) { - throw ex; - } catch (Error ex) { + } catch (RuntimeException | Error ex) { throw ex; } catch (Exception ex) { throw new CodeGenerationException(ex); @@ -201,12 +199,7 @@ public class EmitUtils { final ObjectSwitchCallback callback) throws Exception { final Label def = e.make_label(); final Label end = e.make_label(); - final Map buckets = CollectionUtils.bucket(Arrays.asList(strings), new Transformer() { - @Override - public Object transform(Object value) { - return ((String)value).length(); - } - }); + final Map buckets = CollectionUtils.bucket(Arrays.asList(strings), value -> ((String)value).length()); e.dup(); e.invoke_virtual(Constants.TYPE_STRING, STRING_LENGTH); e.process_switch(getSwitchKeys(buckets), new ProcessSwitchCallback() { @@ -233,12 +226,7 @@ public class EmitUtils { final Label end, final int index) throws Exception { final int len = ((String)strings.get(0)).length(); - final Map buckets = CollectionUtils.bucket(strings, new Transformer() { - @Override - public Object transform(Object value) { - return ((String)value).charAt(index); - } - }); + final Map buckets = CollectionUtils.bucket(strings, value -> ((String)value).charAt(index)); e.dup(); e.push(index); e.invoke_virtual(Constants.TYPE_STRING, STRING_CHAR_AT); @@ -274,12 +262,7 @@ public class EmitUtils { final String[] strings, final ObjectSwitchCallback callback, final boolean skipEquals) throws Exception { - final Map buckets = CollectionUtils.bucket(Arrays.asList(strings), new Transformer() { - @Override - public Object transform(Object value) { - return value.hashCode(); - } - }); + final Map buckets = CollectionUtils.bucket(Arrays.asList(strings), value -> value.hashCode()); final Label def = e.make_label(); final Label end = e.make_label(); e.dup(); @@ -290,8 +273,9 @@ public class EmitUtils { List bucket = (List)buckets.get(key); Label next = null; if (skipEquals && bucket.size() == 1) { - if (skipEquals) - e.pop(); + if (skipEquals) { + e.pop(); + } callback.processCase(bucket.get(0), end); } else { for (Iterator it = bucket.iterator(); it.hasNext();) { @@ -373,8 +357,9 @@ public class EmitUtils { } private static Class remapComponentType(Class componentType) { - if (componentType.equals(Type.class)) - return Class.class; + if (componentType.equals(Type.class)) { + return Class.class; + } return componentType; } @@ -437,12 +422,7 @@ public class EmitUtils { Label end = e.make_label(); e.dup(); e.ifnull(skip); - EmitUtils.process_array(e, type, new ProcessArrayCallback() { - @Override - public void processElement(Type type) { - hash_code(e, type, multiplier, registry); - } - }); + EmitUtils.process_array(e, type, type1 -> hash_code(e, type1, multiplier, registry)); e.goTo(end); e.mark(skip); e.pop(); @@ -752,26 +732,18 @@ public class EmitUtils { boolean useName) { try { final Map cache = new HashMap(); - final ParameterTyper cached = new ParameterTyper() { - @Override - public Type[] getParameterTypes(MethodInfo member) { - Type[] types = (Type[])cache.get(member); - if (types == null) { - cache.put(member, types = member.getSignature().getArgumentTypes()); - } - return types; - } - }; + final ParameterTyper cached = member -> { + Type[] types = (Type[]) cache.get(member); + if (types == null) { + cache.put(member, types = member.getSignature().getArgumentTypes()); + } + return types; + }; final Label def = e.make_label(); final Label end = e.make_label(); if (useName) { e.swap(); - final Map buckets = CollectionUtils.bucket(members, new Transformer() { - @Override - public Object transform(Object value) { - return ((MethodInfo)value).getSignature().getName(); - } - }); + final Map buckets = CollectionUtils.bucket(members, value -> ((MethodInfo)value).getSignature().getName()); String[] names = (String[])buckets.keySet().toArray(new String[buckets.size()]); EmitUtils.string_switch(e, names, Constants.SWITCH_STYLE_HASH, new ObjectSwitchCallback() { @Override @@ -790,9 +762,7 @@ public class EmitUtils { e.pop(); callback.processDefault(); e.mark(end); - } catch (RuntimeException ex) { - throw ex; - } catch (Error ex) { + } catch (RuntimeException | Error ex) { throw ex; } catch (Exception ex) { throw new CodeGenerationException(ex); @@ -805,12 +775,7 @@ public class EmitUtils { final ParameterTyper typer, final Label def, final Label end) throws Exception { - final Map buckets = CollectionUtils.bucket(members, new Transformer() { - @Override - public Object transform(Object value) { - return typer.getParameterTypes((MethodInfo)value).length; - } - }); + final Map buckets = CollectionUtils.bucket(members, value -> typer.getParameterTypes((MethodInfo)value).length); e.dup(); e.arraylength(); e.process_switch(EmitUtils.getSwitchKeys(buckets), new ProcessSwitchCallback() { @@ -856,12 +821,8 @@ public class EmitUtils { int index = -1; for (int i = 0; i < example.length; i++) { final int j = i; - Map test = CollectionUtils.bucket(members, new Transformer() { - @Override - public Object transform(Object value) { - return TypeUtils.emulateClassGetName(typer.getParameterTypes((MethodInfo)value)[j]); - } - }); + Map test = CollectionUtils.bucket(members, + value -> TypeUtils.emulateClassGetName(typer.getParameterTypes((MethodInfo)value)[j])); if (buckets == null || test.size() > buckets.size()) { buckets = test; index = i; @@ -951,8 +912,9 @@ public class EmitUtils { public static void wrap_undeclared_throwable(CodeEmitter e, Block handler, Type[] exceptions, Type wrapper) { Set set = (exceptions == null) ? Collections.EMPTY_SET : new HashSet(Arrays.asList(exceptions)); - if (set.contains(Constants.TYPE_THROWABLE)) - return; + if (set.contains(Constants.TYPE_THROWABLE)) { + return; + } boolean needThrow = exceptions != null; if (!set.contains(Constants.TYPE_RUNTIME_EXCEPTION)) { @@ -964,8 +926,8 @@ public class EmitUtils { needThrow = true; } if (exceptions != null) { - for (int i = 0; i < exceptions.length; i++) { - e.catch_exception(handler, exceptions[i]); + for (Type exception : exceptions) { + e.catch_exception(handler, exception); } } if (needThrow) { diff --git a/spring-core/src/main/java/org/springframework/cglib/core/GeneratorStrategy.java b/spring-core/src/main/java/org/springframework/cglib/core/GeneratorStrategy.java index c345c4449da..050757b7bc2 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/GeneratorStrategy.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/GeneratorStrategy.java @@ -40,5 +40,6 @@ public interface GeneratorStrategy { * correctly implement equals and hashCode * to avoid generating too many classes. */ - boolean equals(Object o); + @Override + boolean equals(Object o); } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/KeyFactory.java b/spring-core/src/main/java/org/springframework/cglib/core/KeyFactory.java index e1503b85c13..2287cb6144e 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/KeyFactory.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/KeyFactory.java @@ -98,20 +98,20 @@ abstract public class KeyFactory { 938313161, 1288102441, 1768288259}; - public static final Customizer CLASS_BY_NAME = new Customizer() { - public void customize(CodeEmitter e, Type type) { - if (type.equals(Constants.TYPE_CLASS)) { - e.invoke_virtual(Constants.TYPE_CLASS, GET_NAME); - } + public static final Customizer CLASS_BY_NAME = (e, type) -> { + if (type.equals(Constants.TYPE_CLASS)) { + e.invoke_virtual(Constants.TYPE_CLASS, GET_NAME); } }; public static final FieldTypeCustomizer STORE_CLASS_AS_STRING = new FieldTypeCustomizer() { + @Override public void customize(CodeEmitter e, int index, Type type) { if (type.equals(Constants.TYPE_CLASS)) { e.invoke_virtual(Constants.TYPE_CLASS, GET_NAME); } } + @Override public Type getOutType(int index, Type type) { if (type.equals(Constants.TYPE_CLASS)) { return Constants.TYPE_STRING; @@ -124,14 +124,12 @@ abstract public class KeyFactory { * {@link Type#hashCode()} is very expensive as it traverses full descriptor to calculate hash code. * This customizer uses {@link Type#getSort()} as a hash code. */ - public static final HashCodeCustomizer HASH_ASM_TYPE = new HashCodeCustomizer() { - public boolean customize(CodeEmitter e, Type type) { - if (Constants.TYPE_TYPE.equals(type)) { - e.invoke_virtual(type, GET_SORT); - return true; - } - return false; + public static final HashCodeCustomizer HASH_ASM_TYPE = (e, type) -> { + if (Constants.TYPE_TYPE.equals(type)) { + e.invoke_virtual(type, GET_SORT); + return true; } + return false; }; /** @@ -139,11 +137,7 @@ abstract public class KeyFactory { * It is recommended to have pre-processing method that would strip Objects and represent Classes as Strings */ @Deprecated - public static final Customizer OBJECT_BY_CLASS = new Customizer() { - public void customize(CodeEmitter e, Type type) { - e.invoke_virtual(Constants.TYPE_OBJECT, GET_CLASS); - } - }; + public static final Customizer OBJECT_BY_CLASS = (e, type) -> e.invoke_virtual(Constants.TYPE_OBJECT, GET_CLASS); protected KeyFactory() { } @@ -204,10 +198,12 @@ abstract public class KeyFactory { super(SOURCE); } + @Override protected ClassLoader getDefaultClassLoader() { return keyInterface.getClassLoader(); } + @Override protected ProtectionDomain getProtectionDomain() { return ReflectUtils.getProtectionDomain(keyInterface); } @@ -245,14 +241,17 @@ abstract public class KeyFactory { this.multiplier = multiplier; } + @Override protected Object firstInstance(Class type) { return ReflectUtils.newInstance(type); } + @Override protected Object nextInstance(Object instance) { return instance; } + @Override public void generateClass(ClassVisitor v) { ClassEmitter ce = new ClassEmitter(v); diff --git a/spring-core/src/main/java/org/springframework/cglib/core/Local.java b/spring-core/src/main/java/org/springframework/cglib/core/Local.java index 93c2d22f35f..563888729a5 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/Local.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/Local.java @@ -21,12 +21,12 @@ public class Local { private Type type; private int index; - + public Local(int index, Type type) { this.type = type; this.index = index; } - + public int getIndex() { return index; } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/LocalVariablesSorter.java b/spring-core/src/main/java/org/springframework/cglib/core/LocalVariablesSorter.java index d3cdd9d548b..7b72028812a 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/LocalVariablesSorter.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/LocalVariablesSorter.java @@ -38,7 +38,7 @@ import org.springframework.asm.Type; * A {@link MethodVisitor} that renumbers local variables in their order of * appearance. This adapter allows one to easily add new local variables to a * method. - * + * * @author Chris Nokleberg * @author Eric Bruneton */ @@ -51,7 +51,7 @@ public class LocalVariablesSorter extends MethodVisitor { */ private static class State { - int[] mapping = new int[40]; + int[] mapping = new int[40]; int nextLocal; } @@ -67,8 +67,8 @@ public class LocalVariablesSorter extends MethodVisitor { state = new State(); Type[] args = Type.getArgumentTypes(desc); state.nextLocal = ((Opcodes.ACC_STATIC & access) != 0) ? 0 : 1; - for (int i = 0; i < args.length; i++) { - state.nextLocal += args[i].getSize(); + for (Type arg : args) { + state.nextLocal += arg.getSize(); } firstLocal = state.nextLocal; } @@ -79,30 +79,27 @@ public class LocalVariablesSorter extends MethodVisitor { firstLocal = lvs.firstLocal; } - public void visitVarInsn(final int opcode, final int var) { - int size; - switch (opcode) { - case Opcodes.LLOAD: - case Opcodes.LSTORE: - case Opcodes.DLOAD: - case Opcodes.DSTORE: - size = 2; - break; - default: - size = 1; - } + @Override + public void visitVarInsn(final int opcode, final int var) { + int size = switch (opcode) { + case Opcodes.LLOAD, Opcodes.LSTORE, Opcodes.DLOAD, Opcodes.DSTORE -> 2; + default -> 1; + }; mv.visitVarInsn(opcode, remap(var, size)); } - public void visitIincInsn(final int var, final int increment) { + @Override + public void visitIincInsn(final int var, final int increment) { mv.visitIincInsn(remap(var, 1), increment); } - public void visitMaxs(final int maxStack, final int maxLocals) { + @Override + public void visitMaxs(final int maxStack, final int maxLocals) { mv.visitMaxs(maxStack, state.nextLocal); } - public void visitLocalVariable( + @Override + public void visitLocalVariable( final String name, final String desc, final String signature, diff --git a/spring-core/src/main/java/org/springframework/cglib/core/MethodInfo.java b/spring-core/src/main/java/org/springframework/cglib/core/MethodInfo.java index 89b48bdad2f..41afcd701cf 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/MethodInfo.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/MethodInfo.java @@ -20,31 +20,34 @@ import org.springframework.asm.Type; abstract public class MethodInfo { - protected MethodInfo() { - } - - abstract public ClassInfo getClassInfo(); - abstract public int getModifiers(); - abstract public Signature getSignature(); - abstract public Type[] getExceptionTypes(); - - @Override - public boolean equals(Object o) { - if (o == null) - return false; - if (!(o instanceof MethodInfo)) - return false; - return getSignature().equals(((MethodInfo)o).getSignature()); - } - - @Override - public int hashCode() { - return getSignature().hashCode(); - } - - @Override - public String toString() { - // TODO: include modifiers, exceptions - return getSignature().toString(); - } + protected MethodInfo() { + } + + abstract public ClassInfo getClassInfo(); + abstract public int getModifiers(); + abstract public Signature getSignature(); + abstract public Type[] getExceptionTypes(); + + @Override + public boolean equals(Object o) { + if (o == null) { + return false; + } + if (!(o instanceof MethodInfo other)) { + return false; + } + return getSignature().equals(other.getSignature()); + } + + @Override + public int hashCode() { + return getSignature().hashCode(); + } + + @Override + public String toString() { + // TODO: include modifiers, exceptions + return getSignature().toString(); + } + } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/MethodWrapper.java b/spring-core/src/main/java/org/springframework/cglib/core/MethodWrapper.java index 119ffc48c61..fd90500abe9 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/MethodWrapper.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/MethodWrapper.java @@ -16,7 +16,12 @@ package org.springframework.cglib.core; import java.lang.reflect.Method; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; @SuppressWarnings({"rawtypes", "unchecked"}) public class MethodWrapper { diff --git a/spring-core/src/main/java/org/springframework/cglib/core/Predicate.java b/spring-core/src/main/java/org/springframework/cglib/core/Predicate.java index dad9ae37b93..8d1605b1336 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/Predicate.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/Predicate.java @@ -13,9 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.cglib.core; +@FunctionalInterface public interface Predicate { - boolean evaluate(Object arg); + boolean evaluate(Object arg); } - diff --git a/spring-core/src/main/java/org/springframework/cglib/core/ReflectUtils.java b/spring-core/src/main/java/org/springframework/cglib/core/ReflectUtils.java index 4f3f2bac8dd..3efb7663c3b 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/ReflectUtils.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/ReflectUtils.java @@ -60,7 +60,7 @@ public class ReflectUtils { private static final ProtectionDomain PROTECTION_DOMAIN; - private static final List OBJECT_METHODS = new ArrayList(); + private static final List OBJECT_METHODS = new ArrayList<>(); private static BiConsumer generatedClassHandler; @@ -125,11 +125,11 @@ public class ReflectUtils { } public static Type[] getExceptionTypes(Member member) { - if (member instanceof Method) { - return TypeUtils.getTypes(((Method) member).getExceptionTypes()); + if (member instanceof Method method) { + return TypeUtils.getTypes(method.getExceptionTypes()); } - else if (member instanceof Constructor) { - return TypeUtils.getTypes(((Constructor) member).getExceptionTypes()); + else if (member instanceof Constructor constructor) { + return TypeUtils.getTypes(constructor.getExceptionTypes()); } else { throw new IllegalArgumentException("Cannot get exception types of a field"); @@ -137,14 +137,13 @@ public class ReflectUtils { } public static Signature getSignature(Member member) { - if (member instanceof Method) { - return new Signature(member.getName(), Type.getMethodDescriptor((Method) member)); + if (member instanceof Method method) { + return new Signature(member.getName(), Type.getMethodDescriptor(method)); } - else if (member instanceof Constructor) { - Type[] types = TypeUtils.getTypes(((Constructor) member).getParameterTypes()); + else if (member instanceof Constructor constructor) { + Type[] types = TypeUtils.getTypes(constructor.getParameterTypes()); return new Signature(Constants.CONSTRUCTOR_NAME, Type.getMethodDescriptor(Type.VOID_TYPE, types)); - } else { throw new IllegalArgumentException("Cannot get signature of a field"); @@ -230,9 +229,9 @@ public class ReflectUtils { } catch (ClassNotFoundException ignore) { } - for (int i = 0; i < packages.length; i++) { + for (String pkg : packages) { try { - return Class.forName(prefix + packages[i] + '.' + className + suffix, false, loader); + return Class.forName(prefix + pkg + '.' + className + suffix, false, loader); } catch (ClassNotFoundException ignore) { } @@ -274,10 +273,7 @@ public class ReflectUtils { Object result = cstruct.newInstance(args); return result; } - catch (InstantiationException e) { - throw new CodeGenerationException(e); - } - catch (IllegalAccessException e) { + catch (InstantiationException | IllegalAccessException e) { throw new CodeGenerationException(e); } catch (InvocationTargetException e) { @@ -302,8 +298,9 @@ public class ReflectUtils { } public static String[] getNames(Class[] classes) { - if (classes == null) + if (classes == null) { return null; + } String[] names = new String[classes.length]; for (int i = 0; i < names.length; i++) { names[i] = classes[i].getName(); @@ -329,8 +326,7 @@ public class ReflectUtils { public static Method[] getPropertyMethods(PropertyDescriptor[] properties, boolean read, boolean write) { Set methods = new HashSet(); - for (int i = 0; i < properties.length; i++) { - PropertyDescriptor pd = properties[i]; + for (PropertyDescriptor pd : properties) { if (read) { methods.add(pd.getReadMethod()); } @@ -362,8 +358,7 @@ public class ReflectUtils { return all; } List properties = new ArrayList(all.length); - for (int i = 0; i < all.length; i++) { - PropertyDescriptor pd = all[i]; + for (PropertyDescriptor pd : all) { if ((read && pd.getReadMethod() != null) || (write && pd.getWriteMethod() != null)) { properties.add(pd); @@ -396,16 +391,17 @@ public class ReflectUtils { if (type == Object.class) { list.addAll(OBJECT_METHODS); } - else + else { list.addAll(java.util.Arrays.asList(type.getDeclaredMethods())); + } Class superclass = type.getSuperclass(); if (superclass != null) { addAllMethods(superclass, list); } Class[] interfaces = type.getInterfaces(); - for (int i = 0; i < interfaces.length; i++) { - addAllMethods(interfaces[i], list); + for (Class element : interfaces) { + addAllMethods(element, list); } return list; @@ -584,20 +580,25 @@ public class ReflectUtils { return new MethodInfo() { private ClassInfo ci; + @Override public ClassInfo getClassInfo() { - if (ci == null) + if (ci == null) { ci = ReflectUtils.getClassInfo(member.getDeclaringClass()); + } return ci; } + @Override public int getModifiers() { return modifiers; } + @Override public Signature getSignature() { return sig; } + @Override public Type[] getExceptionTypes() { return ReflectUtils.getExceptionTypes(member); } @@ -612,15 +613,19 @@ public class ReflectUtils { final Type type = Type.getType(clazz); final Type sc = (clazz.getSuperclass() == null) ? null : Type.getType(clazz.getSuperclass()); return new ClassInfo() { + @Override public Type getType() { return type; } + @Override public Type getSuperType() { return sc; } + @Override public Type[] getInterfaces() { return TypeUtils.getTypes(clazz.getInterfaces()); } + @Override public int getModifiers() { return clazz.getModifiers(); } @@ -630,8 +635,7 @@ public class ReflectUtils { // used by MethodInterceptorGenerated generated code public static Method[] findMethods(String[] namesAndDescriptors, Method[] methods) { Map map = new HashMap(); - for (int i = 0; i < methods.length; i++) { - Method method = methods[i]; + for (Method method : methods) { map.put(method.getName() + Type.getMethodDescriptor(method), method); } Method[] result = new Method[namesAndDescriptors.length / 2]; diff --git a/spring-core/src/main/java/org/springframework/cglib/core/RejectModifierPredicate.java b/spring-core/src/main/java/org/springframework/cglib/core/RejectModifierPredicate.java index 5bcdb3ae00b..4e24453a83e 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/RejectModifierPredicate.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/RejectModifierPredicate.java @@ -15,7 +15,7 @@ */ package org.springframework.cglib.core; -import java.lang.reflect.*; +import java.lang.reflect.Member; public class RejectModifierPredicate implements Predicate { private int rejectMask; @@ -24,7 +24,8 @@ public class RejectModifierPredicate implements Predicate { this.rejectMask = rejectMask; } - public boolean evaluate(Object arg) { + @Override + public boolean evaluate(Object arg) { return (((Member)arg).getModifiers() & rejectMask) == 0; } } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/Signature.java b/spring-core/src/main/java/org/springframework/cglib/core/Signature.java index ab040ad69c0..421f751d153 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/Signature.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/Signature.java @@ -54,20 +54,24 @@ public class Signature { return Type.getArgumentTypes(desc); } - public String toString() { + @Override + public String toString() { return name + desc; } - public boolean equals(Object o) { - if (o == null) - return false; - if (!(o instanceof Signature)) - return false; - Signature other = (Signature)o; + @Override + public boolean equals(Object o) { + if (o == null) { + return false; + } + if (!(o instanceof Signature other)) { + return false; + } return name.equals(other.name) && desc.equals(other.desc); } - public int hashCode() { + @Override + public int hashCode() { return name.hashCode() ^ desc.hashCode(); } } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/SpringNamingPolicy.java b/spring-core/src/main/java/org/springframework/cglib/core/SpringNamingPolicy.java index ed91f3a2d9e..7eb96dd7017 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/SpringNamingPolicy.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/SpringNamingPolicy.java @@ -36,6 +36,7 @@ public final class SpringNamingPolicy implements NamingPolicy { private SpringNamingPolicy() { } + @Override public String getClassName(String prefix, String source, Object key, Predicate names) { if (prefix == null) { prefix = "org.springframework.cglib.empty.Object"; diff --git a/spring-core/src/main/java/org/springframework/cglib/core/TypeUtils.java b/spring-core/src/main/java/org/springframework/cglib/core/TypeUtils.java index 5ff8a3bfece..5d1694beda4 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/TypeUtils.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/TypeUtils.java @@ -15,7 +15,13 @@ */ package org.springframework.cglib.core; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + import org.springframework.asm.Type; @SuppressWarnings({"rawtypes", "unchecked"}) @@ -63,7 +69,7 @@ public class TypeUtils { public static boolean isAbstract(int access) { return (Constants.ACC_ABSTRACT & access) != 0; } - + public static boolean isInterface(int access) { return (Constants.ACC_INTERFACE & access) != 0; } @@ -71,15 +77,15 @@ public class TypeUtils { public static boolean isPrivate(int access) { return (Constants.ACC_PRIVATE & access) != 0; } - + public static boolean isSynthetic(int access) { return (Constants.ACC_SYNTHETIC & access) != 0; } - + public static boolean isBridge(int access) { return (Constants.ACC_BRIDGE & access) != 0; } - + // getPackage returns null on JDK 1.2 public static String getPackageName(Type type) { return getPackageName(getClassName(type)); @@ -89,7 +95,7 @@ public class TypeUtils { int idx = className.lastIndexOf('.'); return (idx < 0) ? "" : className.substring(0, idx); } - + public static String upperFirst(String s) { if (s == null || s.length() == 0) { return s; @@ -148,8 +154,8 @@ public class TypeUtils { public static int getStackSize(Type[] types) { int size = 0; - for (int i = 0; i < types.length; i++) { - size += types[i].getSize(); + for (Type type : types) { + size += type.getSize(); } return size; } @@ -197,8 +203,8 @@ public class TypeUtils { public static Signature parseConstructor(Type[] types) { StringBuilder sb = new StringBuilder(); sb.append("("); - for (int i = 0; i < types.length; i++) { - sb.append(types[i].getDescriptor()); + for (Type type : types) { + sb.append(type.getDescriptor()); } sb.append(")"); sb.append("V"); diff --git a/spring-core/src/main/java/org/springframework/cglib/core/VisibilityPredicate.java b/spring-core/src/main/java/org/springframework/cglib/core/VisibilityPredicate.java index efd96c70e81..e2ac86175d1 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/VisibilityPredicate.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/VisibilityPredicate.java @@ -15,7 +15,9 @@ */ package org.springframework.cglib.core; -import java.lang.reflect.*; +import java.lang.reflect.Member; +import java.lang.reflect.Modifier; + import org.springframework.asm.Type; @SuppressWarnings({"rawtypes", "unchecked"}) @@ -26,13 +28,14 @@ public class VisibilityPredicate implements Predicate { public VisibilityPredicate(Class source, boolean protectedOk) { this.protectedOk = protectedOk; - // same package is not ok for the bootstrap loaded classes. In all other cases we are + // same package is not ok for the bootstrap loaded classes. In all other cases we are // generating classes in the same classloader this.samePackageOk = source.getClassLoader() != null; pkg = TypeUtils.getPackageName(Type.getType(source)); } - public boolean evaluate(Object arg) { + @Override + public boolean evaluate(Object arg) { Member member = (Member)arg; int mod = member.getModifiers(); if (Modifier.isPrivate(mod)) { @@ -43,9 +46,9 @@ public class VisibilityPredicate implements Predicate { // protected is fine if 'protectedOk' is true (for subclasses) return true; } else { - // protected/package private if the member is in the same package as the source class + // protected/package private if the member is in the same package as the source class // and we are generating into the same classloader. - return samePackageOk + return samePackageOk && pkg.equals(TypeUtils.getPackageName(Type.getType(member.getDeclaringClass()))); } } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/internal/CustomizerRegistry.java b/spring-core/src/main/java/org/springframework/cglib/core/internal/CustomizerRegistry.java index 4e114b56799..b05afceab1d 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/internal/CustomizerRegistry.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/internal/CustomizerRegistry.java @@ -12,7 +12,7 @@ import org.springframework.cglib.core.KeyFactoryCustomizer; @SuppressWarnings({"rawtypes", "unchecked"}) public class CustomizerRegistry { private final Class[] customizerTypes; - private Map> customizers = new HashMap>(); + private Map> customizers = new HashMap<>(); public CustomizerRegistry(Class[] customizerTypes) { this.customizerTypes = customizerTypes; @@ -24,7 +24,7 @@ public class CustomizerRegistry { if (type.isAssignableFrom(klass)) { List list = customizers.get(type); if (list == null) { - customizers.put(type, list = new ArrayList()); + customizers.put(type, list = new ArrayList<>()); } list.add(customizer); } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/internal/LoadingCache.java b/spring-core/src/main/java/org/springframework/cglib/core/internal/LoadingCache.java index 4c63211683b..2bbc10e8db7 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/internal/LoadingCache.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/internal/LoadingCache.java @@ -1,6 +1,9 @@ package org.springframework.cglib.core.internal; -import java.util.concurrent.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; @SuppressWarnings({"rawtypes", "unchecked"}) public class LoadingCache { @@ -8,16 +11,12 @@ public class LoadingCache { protected final Function loader; protected final Function keyMapper; - public static final Function IDENTITY = new Function() { - public Object apply(Object key) { - return key; - } - }; + public static final Function IDENTITY = key -> key; public LoadingCache(Function keyMapper, Function loader) { this.keyMapper = keyMapper; this.loader = loader; - this.map = new ConcurrentHashMap(); + this.map = new ConcurrentHashMap<>(); } @SuppressWarnings("unchecked") @@ -50,11 +49,7 @@ public class LoadingCache { // Another thread is already loading an instance task = (FutureTask) v; } else { - task = new FutureTask(new Callable() { - public V call() throws Exception { - return loader.apply(key); - } - }); + task = new FutureTask<>(() -> loader.apply(key)); Object prevTask = map.putIfAbsent(cacheKey, task); if (prevTask == null) { // creator does the load diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/BridgeMethodResolver.java b/spring-core/src/main/java/org/springframework/cglib/proxy/BridgeMethodResolver.java index 983379385ce..65fcf60600f 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/BridgeMethodResolver.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/BridgeMethodResolver.java @@ -22,12 +22,13 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; -import org.springframework.cglib.core.Constants; -import org.springframework.cglib.core.Signature; + import org.springframework.asm.ClassReader; import org.springframework.asm.ClassVisitor; import org.springframework.asm.MethodVisitor; import org.springframework.asm.Opcodes; +import org.springframework.cglib.core.Constants; +import org.springframework.cglib.core.Signature; /** * Uses bytecode reflection to figure out the targets of all bridge methods that use invokespecial @@ -80,7 +81,7 @@ class BridgeMethodResolver { private static class BridgedFinder extends ClassVisitor { private Map/**/ resolved; private Set/**/ eligibleMethods; - + private Signature currentMethod = null; BridgedFinder(Set eligibleMethods, Map resolved) { @@ -89,17 +90,20 @@ class BridgeMethodResolver { this.eligibleMethods = eligibleMethods; } - public void visit(int version, int access, String name, + @Override + public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { } - public MethodVisitor visitMethod(int access, String name, String desc, + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { Signature sig = new Signature(name, desc); if (eligibleMethods.remove(sig)) { currentMethod = sig; return new MethodVisitor(Constants.ASM_API) { - public void visitMethodInsn( + @Override + public void visitMethodInsn( int opcode, String owner, String name, String desc, boolean itf) { if ((opcode == Opcodes.INVOKESPECIAL || (itf && opcode == Opcodes.INVOKEINTERFACE)) diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackFilter.java b/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackFilter.java index 1fc8079c51d..fbba99768b0 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackFilter.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackFilter.java @@ -31,7 +31,7 @@ public interface CallbackFilter { /** * Map a method to a callback. * @param method the intercepted method - * @return the index into the array of callbacks (as specified by {@link Enhancer#setCallbacks}) to use for the method, + * @return the index into the array of callbacks (as specified by {@link Enhancer#setCallbacks}) to use for the method, */ int accept(Method method); @@ -42,5 +42,6 @@ public interface CallbackFilter { * hashCode for custom CallbackFilter * implementations in order to improve performance. */ - boolean equals(Object o); + @Override + boolean equals(Object o); } diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackGenerator.java b/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackGenerator.java index 168dab3b118..22a3bfae86c 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackGenerator.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackGenerator.java @@ -16,7 +16,11 @@ package org.springframework.cglib.proxy; import java.util.List; -import org.springframework.cglib.core.*; + +import org.springframework.cglib.core.ClassEmitter; +import org.springframework.cglib.core.CodeEmitter; +import org.springframework.cglib.core.MethodInfo; +import org.springframework.cglib.core.Signature; @SuppressWarnings({"rawtypes", "unchecked"}) interface CallbackGenerator diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackHelper.java b/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackHelper.java index 9aa54f0728c..4f8b3726f07 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackHelper.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackHelper.java @@ -15,9 +15,13 @@ */ package org.springframework.cglib.proxy; -import org.springframework.cglib.core.ReflectUtils; import java.lang.reflect.Method; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.cglib.core.ReflectUtils; /** * @version $Id: CallbackHelper.java,v 1.2 2004/06/24 21:15:20 herbyderby Exp $ @@ -28,22 +32,24 @@ implements CallbackFilter { private Map methodMap = new HashMap(); private List callbacks = new ArrayList(); - - public CallbackHelper(Class superclass, Class[] interfaces) - { + + public CallbackHelper(Class superclass, Class[] interfaces) { List methods = new ArrayList(); Enhancer.getMethods(superclass, interfaces, methods); Map indexes = new HashMap(); for (int i = 0, size = methods.size(); i < size; i++) { Method method = (Method)methods.get(i); Object callback = getCallback(method); - if (callback == null) + if (callback == null) { throw new IllegalStateException("getCallback cannot return null"); + } boolean isCallback = callback instanceof Callback; - if (!(isCallback || (callback instanceof Class))) + if (!(isCallback || (callback instanceof Class))) { throw new IllegalStateException("getCallback must return a Callback or a Class"); - if (i > 0 && ((callbacks.get(i - 1) instanceof Callback) ^ isCallback)) + } + if (i > 0 && ((callbacks.get(i - 1) instanceof Callback) ^ isCallback)) { throw new IllegalStateException("getCallback must return a Callback or a Class consistently for every Method"); + } Integer index = (Integer)indexes.get(callback); if (index == null) { index = callbacks.size(); @@ -56,44 +62,49 @@ implements CallbackFilter abstract protected Object getCallback(Method method); - public Callback[] getCallbacks() - { - if (callbacks.size() == 0) + public Callback[] getCallbacks() { + if (callbacks.size() == 0) { return new Callback[0]; + } if (callbacks.get(0) instanceof Callback) { return (Callback[])callbacks.toArray(new Callback[callbacks.size()]); - } else { + } + else { throw new IllegalStateException("getCallback returned classes, not callbacks; call getCallbackTypes instead"); } } - public Class[] getCallbackTypes() - { - if (callbacks.size() == 0) + public Class[] getCallbackTypes() { + if (callbacks.size() == 0) { return new Class[0]; + } if (callbacks.get(0) instanceof Callback) { return ReflectUtils.getClasses(getCallbacks()); - } else { + } + else { return (Class[])callbacks.toArray(new Class[callbacks.size()]); } } - public int accept(Method method) - { + @Override + public int accept(Method method) { return ((Integer)methodMap.get(method)).intValue(); } - public int hashCode() - { + @Override + public int hashCode() { return methodMap.hashCode(); } - - public boolean equals(Object o) - { - if (o == null) + + @Override + public boolean equals(Object o) { + if (o == null) { return false; - if (!(o instanceof CallbackHelper)) + } + if (!(o instanceof CallbackHelper other)) { return false; - return methodMap.equals(((CallbackHelper)o).methodMap); + } + return this.methodMap.equals(other.methodMap); } + } diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackInfo.java b/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackInfo.java index e1a5cbc5bb6..5ec7db4c918 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackInfo.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/CallbackInfo.java @@ -57,7 +57,7 @@ class CallbackInfo private Class cls; private CallbackGenerator generator; private Type type; - + private static final CallbackInfo[] CALLBACKS = { new CallbackInfo(NoOp.class, NoOpGenerator.INSTANCE), new CallbackInfo(MethodInterceptor.class, MethodInterceptorGenerator.INSTANCE), @@ -84,8 +84,7 @@ class CallbackInfo private static Type determineType(Class callbackType, boolean checkAll) { Class cur = null; Type type = null; - for (int i = 0; i < CALLBACKS.length; i++) { - CallbackInfo info = CALLBACKS[i]; + for (CallbackInfo info : CALLBACKS) { if (info.cls.isAssignableFrom(callbackType)) { if (cur != null) { throw new IllegalStateException("Callback implements both " + cur + " and " + info.cls); @@ -104,8 +103,7 @@ class CallbackInfo } private static CallbackGenerator getGenerator(Type callbackType) { - for (int i = 0; i < CALLBACKS.length; i++) { - CallbackInfo info = CALLBACKS[i]; + for (CallbackInfo info : CALLBACKS) { if (info.type.equals(callbackType)) { return info.generator; } @@ -113,5 +111,5 @@ class CallbackInfo throw new IllegalStateException("Unknown callback type " + callbackType); } } - + diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/DispatcherGenerator.java b/spring-core/src/main/java/org/springframework/cglib/proxy/DispatcherGenerator.java index 154f7d7363c..b13c38cf061 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/DispatcherGenerator.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/DispatcherGenerator.java @@ -15,9 +15,15 @@ */ package org.springframework.cglib.proxy; -import java.util.*; -import org.springframework.cglib.core.*; +import java.util.Iterator; +import java.util.List; + import org.springframework.asm.Type; +import org.springframework.cglib.core.ClassEmitter; +import org.springframework.cglib.core.CodeEmitter; +import org.springframework.cglib.core.MethodInfo; +import org.springframework.cglib.core.Signature; +import org.springframework.cglib.core.TypeUtils; @SuppressWarnings({"rawtypes", "unchecked"}) class DispatcherGenerator implements CallbackGenerator { @@ -41,7 +47,8 @@ class DispatcherGenerator implements CallbackGenerator { this.proxyRef = proxyRef; } - public void generate(ClassEmitter ce, Context context, List methods) { + @Override + public void generate(ClassEmitter ce, Context context, List methods) { for (Iterator it = methods.iterator(); it.hasNext();) { MethodInfo method = (MethodInfo)it.next(); if (!TypeUtils.isProtected(method.getModifiers())) { @@ -62,5 +69,6 @@ class DispatcherGenerator implements CallbackGenerator { } } - public void generateStatic(CodeEmitter e, Context context, List methods) { } + @Override + public void generateStatic(CodeEmitter e, Context context, List methods) { } } diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/Enhancer.java b/spring-core/src/main/java/org/springframework/cglib/proxy/Enhancer.java index 42de4db409c..fc655f244ad 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/Enhancer.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/Enhancer.java @@ -51,7 +51,6 @@ import org.springframework.cglib.core.ProcessSwitchCallback; import org.springframework.cglib.core.ReflectUtils; import org.springframework.cglib.core.RejectModifierPredicate; import org.springframework.cglib.core.Signature; -import org.springframework.cglib.core.Transformer; import org.springframework.cglib.core.TypeUtils; import org.springframework.cglib.core.VisibilityPredicate; import org.springframework.cglib.core.WeakCacheKey; @@ -91,11 +90,7 @@ import org.springframework.cglib.core.WeakCacheKey; @SuppressWarnings({"rawtypes", "unchecked"}) public class Enhancer extends AbstractClassGenerator { - private static final CallbackFilter ALL_ZERO = new CallbackFilter() { - public int accept(Method method) { - return 0; - } - }; + private static final CallbackFilter ALL_ZERO = method -> 0; private static final Source SOURCE = new Source(Enhancer.class.getName()); @@ -463,12 +458,12 @@ public class Enhancer extends AbstractClassGenerator { callbackTypes = CallbackInfo.determineTypes(callbacks); } if (interfaces != null) { - for (int i = 0; i < interfaces.length; i++) { - if (interfaces[i] == null) { + for (Class element : interfaces) { + if (element == null) { throw new IllegalStateException("Interfaces cannot be null"); } - if (!interfaces[i].isInterface()) { - throw new IllegalStateException(interfaces[i] + " is not an interface"); + if (!element.isInterface()) { + throw new IllegalStateException(element + " is not an interface"); } } } @@ -557,7 +552,7 @@ public class Enhancer extends AbstractClassGenerator { // SPRING PATCH BEGIN Object key = new EnhancerKey((superclass != null ? superclass.getName() : null), (interfaces != null ? Arrays.asList(ReflectUtils.getNames(interfaces)) : null), - (filter == ALL_ZERO ? null : new WeakCacheKey(filter)), + (filter == ALL_ZERO ? null : new WeakCacheKey<>(filter)), Arrays.asList(callbackTypes), useFactory, interceptDuringConstruction, @@ -580,6 +575,7 @@ public class Enhancer extends AbstractClassGenerator { return super.generate(data); } + @Override protected ClassLoader getDefaultClassLoader() { if (superclass != null) { return superclass.getClassLoader(); @@ -592,6 +588,7 @@ public class Enhancer extends AbstractClassGenerator { } } + @Override protected ProtectionDomain getProtectionDomain() { if (superclass != null) { return ReflectUtils.getProtectionDomain(superclass); @@ -630,9 +627,9 @@ public class Enhancer extends AbstractClassGenerator { ReflectUtils.addAllMethods(superclass, methods); List target = (interfaceMethods != null) ? interfaceMethods : methods; if (interfaces != null) { - for (int i = 0; i < interfaces.length; i++) { - if (interfaces[i] != Factory.class) { - ReflectUtils.addAllMethods(interfaces[i], target); + for (Class element : interfaces) { + if (element != Factory.class) { + ReflectUtils.addAllMethods(element, target); } } } @@ -648,11 +645,13 @@ public class Enhancer extends AbstractClassGenerator { CollectionUtils.filter(methods, new RejectModifierPredicate(Constants.ACC_FINAL)); } + @Override public void generateClass(ClassVisitor v) throws Exception { Class sc = (superclass == null) ? Object.class : superclass; - if (TypeUtils.isFinal(sc.getModifiers())) + if (TypeUtils.isFinal(sc.getModifiers())) { throw new IllegalArgumentException("Cannot subclass final class " + sc.getName()); + } List constructors = new ArrayList(Arrays.asList(sc.getDeclaredConstructors())); filterConstructors(sc, constructors); @@ -664,19 +663,17 @@ public class Enhancer extends AbstractClassGenerator { final Set forcePublic = new HashSet(); getMethods(sc, interfaces, actualMethods, interfaceMethods, forcePublic); - List methods = CollectionUtils.transform(actualMethods, new Transformer() { - public Object transform(Object value) { - Method method = (Method) value; - int modifiers = Constants.ACC_FINAL - | (method.getModifiers() - & ~Constants.ACC_ABSTRACT - & ~Constants.ACC_NATIVE - & ~Constants.ACC_SYNCHRONIZED); - if (forcePublic.contains(MethodWrapper.create(method))) { - modifiers = (modifiers & ~Constants.ACC_PROTECTED) | Constants.ACC_PUBLIC; - } - return ReflectUtils.getMethodInfo(method, modifiers); + List methods = CollectionUtils.transform(actualMethods, value -> { + Method method = (Method) value; + int modifiers = Constants.ACC_FINAL + | (method.getModifiers() + & ~Constants.ACC_ABSTRACT + & ~Constants.ACC_NATIVE + & ~Constants.ACC_SYNCHRONIZED); + if (forcePublic.contains(MethodWrapper.create(method))) { + modifiers = (modifiers & ~Constants.ACC_PROTECTED) | Constants.ACC_PUBLIC; } + return ReflectUtils.getMethodInfo(method, modifiers); }); ClassEmitter e = new ClassEmitter(v); @@ -754,8 +751,9 @@ public class Enhancer extends AbstractClassGenerator { */ protected void filterConstructors(Class sc, List constructors) { CollectionUtils.filter(constructors, new VisibilityPredicate(sc, true)); - if (constructors.size() == 0) + if (constructors.size() == 0) { throw new IllegalArgumentException("No visible constructors in " + sc); + } } /** @@ -767,6 +765,7 @@ public class Enhancer extends AbstractClassGenerator { * @return newly created proxy instance * @throws Exception if something goes wrong */ + @Override protected Object firstInstance(Class type) throws Exception { if (classOnly) { return type; @@ -776,6 +775,7 @@ public class Enhancer extends AbstractClassGenerator { } } + @Override protected Object nextInstance(Object instance) { EnhancerFactoryData data = (EnhancerFactoryData) instance; @@ -809,13 +809,10 @@ public class Enhancer extends AbstractClassGenerator { callbackFilterField.setAccessible(true); callbackFilterField.set(null, this.filter); } - catch (NoSuchFieldException e) { - throw new CodeGenerationException(e); - } - catch (IllegalAccessException e) { + catch (NoSuchFieldException | IllegalAccessException e) { throw new CodeGenerationException(e); } - return new WeakReference(factoryData); + return new WeakReference<>(factoryData); } @Override @@ -895,10 +892,7 @@ public class Enhancer extends AbstractClassGenerator { catch (NoSuchMethodException e) { throw new IllegalArgumentException(type + " is not an enhanced class"); } - catch (IllegalAccessException e) { - throw new CodeGenerationException(e); - } - catch (InvocationTargetException e) { + catch (IllegalAccessException | InvocationTargetException e) { throw new CodeGenerationException(e); } } @@ -1027,8 +1021,9 @@ public class Enhancer extends AbstractClassGenerator { e.return_value(); e.end_method(); } - if (!classOnly && !seenNull && arguments == null) + if (!classOnly && !seenNull && arguments == null) { throw new IllegalArgumentException("Superclass has no null constructors but no arguments were given"); + } } private int[] getCallbackKeys() { @@ -1046,11 +1041,13 @@ public class Enhancer extends AbstractClassGenerator { e.load_this(); e.load_arg(0); e.process_switch(keys, new ProcessSwitchCallback() { + @Override public void processCase(int key, Label end) { e.getfield(getCallbackField(key)); e.goTo(end); } + @Override public void processDefault() { e.pop(); // stack height e.aconst_null(); @@ -1064,6 +1061,7 @@ public class Enhancer extends AbstractClassGenerator { final CodeEmitter e = ce.begin_method(Constants.ACC_PUBLIC, SET_CALLBACK, null); e.load_arg(0); e.process_switch(keys, new ProcessSwitchCallback() { + @Override public void processCase(int key, Label end) { e.load_this(); e.load_arg(1); @@ -1072,6 +1070,7 @@ public class Enhancer extends AbstractClassGenerator { e.goTo(end); } + @Override public void processDefault() { // TODO: error? } @@ -1171,6 +1170,7 @@ public class Enhancer extends AbstractClassGenerator { e.dup(); e.load_arg(0); EmitUtils.constructor_switch(e, constructors, new ObjectSwitchCallback() { + @Override public void processCase(Object key, Label end) { MethodInfo constructor = (MethodInfo) key; Type types[] = constructor.getSignature().getArgumentTypes(); @@ -1184,6 +1184,7 @@ public class Enhancer extends AbstractClassGenerator { e.goTo(end); } + @Override public void processDefault() { e.throw_exception(ILLEGAL_ARGUMENT_EXCEPTION, "Constructor not found"); } @@ -1243,26 +1244,32 @@ public class Enhancer extends AbstractClassGenerator { se.putfield(THREAD_CALLBACKS_FIELD); CallbackGenerator.Context context = new CallbackGenerator.Context() { + @Override public ClassLoader getClassLoader() { return Enhancer.this.getClassLoader(); } + @Override public int getOriginalModifiers(MethodInfo method) { return ((Integer) originalModifiers.get(method)).intValue(); } + @Override public int getIndex(MethodInfo method) { return ((Integer) indexes.get(method)).intValue(); } + @Override public void emitCallback(CodeEmitter e, int index) { emitCurrentCallback(e, index); } + @Override public Signature getImplSignature(MethodInfo method) { return rename(method.getSignature(), ((Integer) positions.get(method)).intValue()); } + @Override public void emitLoadArgsAndInvoke(CodeEmitter e, MethodInfo method) { // If this is a bridge and we know the target was called from invokespecial, // then we need to invoke_virtual w/ the bridge target instead of doing @@ -1302,6 +1309,7 @@ public class Enhancer extends AbstractClassGenerator { } } + @Override public CodeEmitter beginMethod(ClassEmitter ce, MethodInfo method) { CodeEmitter e = EmitUtils.begin_method(ce, method); if (!interceptDuringConstruction && diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/Factory.java b/spring-core/src/main/java/org/springframework/cglib/proxy/Factory.java index c924bb10487..7b0df0f6e0c 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/Factory.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/Factory.java @@ -32,14 +32,14 @@ public interface Factory { * If multiple callbacks are required an exception will be thrown. * @param callback the new interceptor to use * @return new instance of the same type - */ + */ Object newInstance(Callback callback); - + /** * Creates new instance of the same type, using the no-arg constructor. * @param callbacks the new callbacks(s) to use * @return new instance of the same type - */ + */ Object newInstance(Callback[] callbacks); /** @@ -75,6 +75,6 @@ public interface Factory { /** * Get the current set of callbacks for ths object. * @return a new array instance - */ + */ Callback[] getCallbacks(); } diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/FixedValueGenerator.java b/spring-core/src/main/java/org/springframework/cglib/proxy/FixedValueGenerator.java index f34e2b46895..fc21a7026ed 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/FixedValueGenerator.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/FixedValueGenerator.java @@ -15,9 +15,15 @@ */ package org.springframework.cglib.proxy; -import java.util.*; -import org.springframework.cglib.core.*; +import java.util.Iterator; +import java.util.List; + import org.springframework.asm.Type; +import org.springframework.cglib.core.ClassEmitter; +import org.springframework.cglib.core.CodeEmitter; +import org.springframework.cglib.core.MethodInfo; +import org.springframework.cglib.core.Signature; +import org.springframework.cglib.core.TypeUtils; @SuppressWarnings({"rawtypes", "unchecked"}) class FixedValueGenerator implements CallbackGenerator { @@ -27,7 +33,8 @@ class FixedValueGenerator implements CallbackGenerator { private static final Signature LOAD_OBJECT = TypeUtils.parseSignature("Object loadObject()"); - public void generate(ClassEmitter ce, Context context, List methods) { + @Override + public void generate(ClassEmitter ce, Context context, List methods) { for (Iterator it = methods.iterator(); it.hasNext();) { MethodInfo method = (MethodInfo)it.next(); CodeEmitter e = context.beginMethod(ce, method); @@ -39,5 +46,6 @@ class FixedValueGenerator implements CallbackGenerator { } } - public void generateStatic(CodeEmitter e, Context context, List methods) { } + @Override + public void generateStatic(CodeEmitter e, Context context, List methods) { } } diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/InterfaceMaker.java b/spring-core/src/main/java/org/springframework/cglib/proxy/InterfaceMaker.java index 258412c592f..9ed15417a31 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/InterfaceMaker.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/InterfaceMaker.java @@ -15,11 +15,18 @@ */ package org.springframework.cglib.proxy; -import java.lang.reflect.*; -import java.util.*; -import org.springframework.cglib.core.*; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + import org.springframework.asm.ClassVisitor; import org.springframework.asm.Type; +import org.springframework.cglib.core.AbstractClassGenerator; +import org.springframework.cglib.core.ClassEmitter; +import org.springframework.cglib.core.Constants; +import org.springframework.cglib.core.ReflectUtils; +import org.springframework.cglib.core.Signature; /** * Generates new interfaces at runtime. @@ -71,8 +78,7 @@ public class InterfaceMaker extends AbstractClassGenerator */ public void add(Class clazz) { Method[] methods = clazz.getMethods(); - for (int i = 0; i < methods.length; i++) { - Method m = methods[i]; + for (Method m : methods) { if (!m.getDeclaringClass().getName().equals("java.lang.Object")) { add(m); } @@ -87,19 +93,23 @@ public class InterfaceMaker extends AbstractClassGenerator return (Class)super.create(this); } - protected ClassLoader getDefaultClassLoader() { + @Override + protected ClassLoader getDefaultClassLoader() { return null; } - - protected Object firstInstance(Class type) { + + @Override + protected Object firstInstance(Class type) { return type; } - protected Object nextInstance(Object instance) { + @Override + protected Object nextInstance(Object instance) { throw new IllegalStateException("InterfaceMaker does not cache"); } - public void generateClass(ClassVisitor v) throws Exception { + @Override + public void generateClass(ClassVisitor v) throws Exception { ClassEmitter ce = new ClassEmitter(v); ce.begin_class(Constants.V1_8, Constants.ACC_PUBLIC | Constants.ACC_INTERFACE | Constants.ACC_ABSTRACT, diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/InvocationHandlerGenerator.java b/spring-core/src/main/java/org/springframework/cglib/proxy/InvocationHandlerGenerator.java index d788729a568..92e57b05862 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/InvocationHandlerGenerator.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/InvocationHandlerGenerator.java @@ -15,9 +15,18 @@ */ package org.springframework.cglib.proxy; -import org.springframework.cglib.core.*; -import java.util.*; +import java.util.Iterator; +import java.util.List; + import org.springframework.asm.Type; +import org.springframework.cglib.core.Block; +import org.springframework.cglib.core.ClassEmitter; +import org.springframework.cglib.core.CodeEmitter; +import org.springframework.cglib.core.Constants; +import org.springframework.cglib.core.EmitUtils; +import org.springframework.cglib.core.MethodInfo; +import org.springframework.cglib.core.Signature; +import org.springframework.cglib.core.TypeUtils; @SuppressWarnings({"rawtypes", "unchecked"}) class InvocationHandlerGenerator @@ -34,7 +43,8 @@ implements CallbackGenerator private static final Signature INVOKE = TypeUtils.parseSignature("Object invoke(Object, java.lang.reflect.Method, Object[])"); - public void generate(ClassEmitter ce, Context context, List methods) { + @Override + public void generate(ClassEmitter ce, Context context, List methods) { for (Iterator it = methods.iterator(); it.hasNext();) { MethodInfo method = (MethodInfo)it.next(); Signature impl = context.getImplSignature(method); @@ -55,7 +65,8 @@ implements CallbackGenerator } } - public void generateStatic(CodeEmitter e, Context context, List methods) { + @Override + public void generateStatic(CodeEmitter e, Context context, List methods) { for (Iterator it = methods.iterator(); it.hasNext();) { MethodInfo method = (MethodInfo)it.next(); EmitUtils.load_method(e, method); diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/LazyLoaderGenerator.java b/spring-core/src/main/java/org/springframework/cglib/proxy/LazyLoaderGenerator.java index 49261578b47..d8647f7bee9 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/LazyLoaderGenerator.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/LazyLoaderGenerator.java @@ -15,21 +15,31 @@ */ package org.springframework.cglib.proxy; -import java.util.*; -import org.springframework.cglib.core.*; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + import org.springframework.asm.Label; import org.springframework.asm.Type; +import org.springframework.cglib.core.ClassEmitter; +import org.springframework.cglib.core.CodeEmitter; +import org.springframework.cglib.core.Constants; +import org.springframework.cglib.core.MethodInfo; +import org.springframework.cglib.core.Signature; +import org.springframework.cglib.core.TypeUtils; @SuppressWarnings({"rawtypes", "unchecked"}) class LazyLoaderGenerator implements CallbackGenerator { public static final LazyLoaderGenerator INSTANCE = new LazyLoaderGenerator(); - private static final Signature LOAD_OBJECT = + private static final Signature LOAD_OBJECT = TypeUtils.parseSignature("Object loadObject()"); private static final Type LAZY_LOADER = TypeUtils.parseType("org.springframework.cglib.proxy.LazyLoader"); - public void generate(ClassEmitter ce, Context context, List methods) { + @Override + public void generate(ClassEmitter ce, Context context, List methods) { Set indexes = new HashSet(); for (Iterator it = methods.iterator(); it.hasNext();) { MethodInfo method = (MethodInfo)it.next(); @@ -75,7 +85,7 @@ class LazyLoaderGenerator implements CallbackGenerator { e.mark(end); e.return_value(); e.end_method(); - + } } @@ -85,5 +95,6 @@ class LazyLoaderGenerator implements CallbackGenerator { Constants.TYPES_EMPTY); } - public void generateStatic(CodeEmitter e, Context context, List methods) { } + @Override + public void generateStatic(CodeEmitter e, Context context, List methods) { } } diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/MethodInterceptor.java b/spring-core/src/main/java/org/springframework/cglib/proxy/MethodInterceptor.java index 741ef943b18..c7db04bf11f 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/MethodInterceptor.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/MethodInterceptor.java @@ -35,7 +35,7 @@ extends Callback * @throws Throwable any exception may be thrown; if so, super method will not be invoked * @return any value compatible with the signature of the proxied method. Method returning void will ignore this value. * @see MethodProxy - */ + */ public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args, MethodProxy proxy) throws Throwable; diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/MethodInterceptorGenerator.java b/spring-core/src/main/java/org/springframework/cglib/proxy/MethodInterceptorGenerator.java index 863c4df0d9f..9a8b008a030 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/MethodInterceptorGenerator.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/MethodInterceptorGenerator.java @@ -79,12 +79,7 @@ implements CallbackGenerator new Signature(FIND_PROXY_NAME, METHOD_PROXY, new Type[]{ Constants.TYPE_SIGNATURE }); private static final Signature TO_STRING = TypeUtils.parseSignature("String toString()"); - private static final Transformer METHOD_TO_CLASS = new Transformer(){ - @Override - public Object transform(Object value) { - return ((MethodInfo)value).getClassInfo(); - } - }; + private static final Transformer METHOD_TO_CLASS = value -> ((MethodInfo)value).getClassInfo(); private String getMethodField(Signature impl) { return impl.getName() + "$Method"; diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/MethodProxy.java b/spring-core/src/main/java/org/springframework/cglib/proxy/MethodProxy.java index 93cfcfc5a8f..ca468ca4324 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/MethodProxy.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/MethodProxy.java @@ -234,8 +234,9 @@ public class MethodProxy { throw ex.getTargetException(); } catch (IllegalArgumentException ex) { - if (fastClassInfo.i1 < 0) + if (fastClassInfo.i1 < 0) { throw new IllegalArgumentException("Protected method: " + sig1); + } throw ex; } } diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/MixinBeanEmitter.java b/spring-core/src/main/java/org/springframework/cglib/proxy/MixinBeanEmitter.java index 865a67e5180..8e76df1fb1c 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/MixinBeanEmitter.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/MixinBeanEmitter.java @@ -16,8 +16,9 @@ package org.springframework.cglib.proxy; import java.lang.reflect.Method; -import org.springframework.cglib.core.ReflectUtils; + import org.springframework.asm.ClassVisitor; +import org.springframework.cglib.core.ReflectUtils; /** * @author Chris Nokleberg @@ -29,11 +30,13 @@ class MixinBeanEmitter extends MixinEmitter { super(v, className, classes, null); } - protected Class[] getInterfaces(Class[] classes) { + @Override + protected Class[] getInterfaces(Class[] classes) { return null; } - protected Method[] getMethods(Class type) { + @Override + protected Method[] getMethods(Class type) { return ReflectUtils.getPropertyMethods(ReflectUtils.getBeanProperties(type), true, true); } } diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/MixinEmitter.java b/spring-core/src/main/java/org/springframework/cglib/proxy/MixinEmitter.java index 9fda5dac12b..ab2460fe9f8 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/MixinEmitter.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/MixinEmitter.java @@ -16,10 +16,20 @@ package org.springframework.cglib.proxy; import java.lang.reflect.Method; -import java.util.*; -import org.springframework.cglib.core.*; +import java.util.HashSet; +import java.util.Set; + import org.springframework.asm.ClassVisitor; import org.springframework.asm.Type; +import org.springframework.cglib.core.ClassEmitter; +import org.springframework.cglib.core.CodeEmitter; +import org.springframework.cglib.core.Constants; +import org.springframework.cglib.core.EmitUtils; +import org.springframework.cglib.core.MethodInfo; +import org.springframework.cglib.core.MethodWrapper; +import org.springframework.cglib.core.ReflectUtils; +import org.springframework.cglib.core.Signature; +import org.springframework.cglib.core.TypeUtils; /** * @author Chris Nokleberg @@ -61,20 +71,20 @@ class MixinEmitter extends ClassEmitter { Set unique = new HashSet(); for (int i = 0; i < classes.length; i++) { Method[] methods = getMethods(classes[i]); - for (int j = 0; j < methods.length; j++) { - if (unique.add(MethodWrapper.create(methods[j]))) { - MethodInfo method = ReflectUtils.getMethodInfo(methods[j]); + for (Method method : methods) { + if (unique.add(MethodWrapper.create(method))) { + MethodInfo methodInfo = ReflectUtils.getMethodInfo(method); int modifiers = Constants.ACC_PUBLIC; - if ((method.getModifiers() & Constants.ACC_VARARGS) == Constants.ACC_VARARGS) { + if ((methodInfo.getModifiers() & Constants.ACC_VARARGS) == Constants.ACC_VARARGS) { modifiers |= Constants.ACC_VARARGS; } - e = EmitUtils.begin_method(this, method, modifiers); + e = EmitUtils.begin_method(this, methodInfo, modifiers); e.load_this(); e.getfield(FIELD_NAME); e.aaload((route != null) ? route[i] : i); - e.checkcast(method.getClassInfo().getType()); + e.checkcast(methodInfo.getClassInfo().getType()); e.load_args(); - e.invoke(method); + e.invoke(methodInfo); e.return_value(); e.end_method(); } diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/MixinEverythingEmitter.java b/spring-core/src/main/java/org/springframework/cglib/proxy/MixinEverythingEmitter.java index e335e218c17..7a672c6a459 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/MixinEverythingEmitter.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/MixinEverythingEmitter.java @@ -13,15 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.cglib.proxy; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.springframework.asm.ClassVisitor; import org.springframework.cglib.core.CollectionUtils; import org.springframework.cglib.core.ReflectUtils; import org.springframework.cglib.core.RejectModifierPredicate; -import org.springframework.asm.ClassVisitor; /** * @author Chris Nokleberg @@ -34,15 +38,17 @@ class MixinEverythingEmitter extends MixinEmitter { super(v, className, classes, null); } + @Override protected Class[] getInterfaces(Class[] classes) { List list = new ArrayList(); - for (int i = 0; i < classes.length; i++) { - ReflectUtils.addAllInterfaces(classes[i], list); + for (Class clazz : classes) { + ReflectUtils.addAllInterfaces(clazz, list); } return (Class[])list.toArray(new Class[list.size()]); } - protected Method[] getMethods(Class type) { + @Override + protected Method[] getMethods(Class type) { List methods = new ArrayList(Arrays.asList(type.getMethods())); CollectionUtils.filter(methods, new RejectModifierPredicate(Modifier.FINAL | Modifier.STATIC)); return (Method[])methods.toArray(new Method[methods.size()]); diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/NoOpGenerator.java b/spring-core/src/main/java/org/springframework/cglib/proxy/NoOpGenerator.java index c2b6bd3bb18..71aeacd5585 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/NoOpGenerator.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/NoOpGenerator.java @@ -17,7 +17,12 @@ package org.springframework.cglib.proxy; import java.util.Iterator; import java.util.List; -import org.springframework.cglib.core.*; + +import org.springframework.cglib.core.ClassEmitter; +import org.springframework.cglib.core.CodeEmitter; +import org.springframework.cglib.core.EmitUtils; +import org.springframework.cglib.core.MethodInfo; +import org.springframework.cglib.core.TypeUtils; @SuppressWarnings({"rawtypes", "unchecked"}) class NoOpGenerator @@ -25,7 +30,8 @@ implements CallbackGenerator { public static final NoOpGenerator INSTANCE = new NoOpGenerator(); - public void generate(ClassEmitter ce, Context context, List methods) { + @Override + public void generate(ClassEmitter ce, Context context, List methods) { for (Iterator it = methods.iterator(); it.hasNext();) { MethodInfo method = (MethodInfo)it.next(); if (TypeUtils.isBridge(method.getModifiers()) || ( @@ -39,6 +45,7 @@ implements CallbackGenerator } } } - - public void generateStatic(CodeEmitter e, Context context, List methods) { } + + @Override + public void generateStatic(CodeEmitter e, Context context, List methods) { } } diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/Proxy.java b/spring-core/src/main/java/org/springframework/cglib/proxy/Proxy.java index 0e70ff47781..15a7b1296ae 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/Proxy.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/Proxy.java @@ -17,7 +17,6 @@ package org.springframework.cglib.proxy; import java.io.Serializable; -import java.lang.reflect.Method; import org.springframework.cglib.core.CodeGenerationException; @@ -40,20 +39,17 @@ import org.springframework.cglib.core.CodeGenerationException; public class Proxy implements Serializable { protected InvocationHandler h; - private static final CallbackFilter BAD_OBJECT_METHOD_FILTER = new CallbackFilter() { - @Override - public int accept(Method method) { - if (method.getDeclaringClass().getName().equals("java.lang.Object")) { - String name = method.getName(); - if (!(name.equals("hashCode") || - name.equals("equals") || - name.equals("toString"))) { - return 1; - } - } - return 0; - } - }; + private static final CallbackFilter BAD_OBJECT_METHOD_FILTER = method -> { + if (method.getDeclaringClass().getName().equals("java.lang.Object")) { + String name = method.getName(); + if (!(name.equals("hashCode") || + name.equals("equals") || + name.equals("toString"))) { + return 1; + } + } + return 0; + }; protected Proxy(InvocationHandler h) { Enhancer.registerCallbacks(getClass(), new Callback[]{ h, null }); diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/UndeclaredThrowableException.java b/spring-core/src/main/java/org/springframework/cglib/proxy/UndeclaredThrowableException.java index f566e560ef2..f3e010e87d3 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/UndeclaredThrowableException.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/UndeclaredThrowableException.java @@ -30,7 +30,7 @@ public class UndeclaredThrowableException extends CodeGenerationException { public UndeclaredThrowableException(Throwable t) { super(t); } - + public Throwable getUndeclaredThrowable() { return getCause(); } diff --git a/spring-core/src/main/java/org/springframework/cglib/reflect/ConstructorDelegate.java b/spring-core/src/main/java/org/springframework/cglib/reflect/ConstructorDelegate.java index 331b78a093b..5bb1c4bbff7 100644 --- a/spring-core/src/main/java/org/springframework/cglib/reflect/ConstructorDelegate.java +++ b/spring-core/src/main/java/org/springframework/cglib/reflect/ConstructorDelegate.java @@ -15,11 +15,20 @@ */ package org.springframework.cglib.reflect; -import java.lang.reflect.*; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; import java.security.ProtectionDomain; -import org.springframework.cglib.core.*; + import org.springframework.asm.ClassVisitor; import org.springframework.asm.Type; +import org.springframework.cglib.core.AbstractClassGenerator; +import org.springframework.cglib.core.ClassEmitter; +import org.springframework.cglib.core.CodeEmitter; +import org.springframework.cglib.core.Constants; +import org.springframework.cglib.core.EmitUtils; +import org.springframework.cglib.core.KeyFactory; +import org.springframework.cglib.core.ReflectUtils; +import org.springframework.cglib.core.TypeUtils; /** * @author Chris Nokleberg @@ -29,7 +38,7 @@ import org.springframework.asm.Type; abstract public class ConstructorDelegate { private static final ConstructorKey KEY_FACTORY = (ConstructorKey)KeyFactory.create(ConstructorKey.class, KeyFactory.CLASS_BY_NAME); - + interface ConstructorKey { public Object newInstance(String declaring, String iface); } @@ -70,15 +79,18 @@ abstract public class ConstructorDelegate { return (ConstructorDelegate)super.create(key); } - protected ClassLoader getDefaultClassLoader() { + @Override + protected ClassLoader getDefaultClassLoader() { return targetClass.getClassLoader(); } - protected ProtectionDomain getProtectionDomain() { + @Override + protected ProtectionDomain getProtectionDomain() { return ReflectUtils.getProtectionDomain(targetClass); } - public void generateClass(ClassVisitor v) { + @Override + public void generateClass(ClassVisitor v) { setNamePrefix(targetClass.getName()); final Method newInstance = ReflectUtils.findNewInstance(iface); @@ -113,11 +125,13 @@ abstract public class ConstructorDelegate { ce.end_class(); } - protected Object firstInstance(Class type) { + @Override + protected Object firstInstance(Class type) { return ReflectUtils.newInstance(type); } - protected Object nextInstance(Object instance) { + @Override + protected Object nextInstance(Object instance) { return instance; } } diff --git a/spring-core/src/main/java/org/springframework/cglib/reflect/FastClass.java b/spring-core/src/main/java/org/springframework/cglib/reflect/FastClass.java index 830cfe2103c..f2ad4817610 100644 --- a/spring-core/src/main/java/org/springframework/cglib/reflect/FastClass.java +++ b/spring-core/src/main/java/org/springframework/cglib/reflect/FastClass.java @@ -15,13 +15,17 @@ */ package org.springframework.cglib.reflect; -import org.springframework.cglib.core.*; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.security.ProtectionDomain; + import org.springframework.asm.ClassVisitor; import org.springframework.asm.Type; +import org.springframework.cglib.core.AbstractClassGenerator; +import org.springframework.cglib.core.Constants; +import org.springframework.cglib.core.ReflectUtils; +import org.springframework.cglib.core.Signature; @SuppressWarnings({"rawtypes", "unchecked"}) abstract public class FastClass @@ -37,9 +41,9 @@ abstract public class FastClass } public static FastClass create(Class type) { - + return create(type.getClassLoader(),type); - + } public static FastClass create(ClassLoader loader, Class type) { Generator gen = new Generator(); @@ -52,7 +56,7 @@ abstract public class FastClass { private static final Source SOURCE = new Source(FastClass.class.getName()); private Class type; - + public Generator() { super(SOURCE); } @@ -60,35 +64,40 @@ abstract public class FastClass public void setType(Class type) { this.type = type; } - + public FastClass create() { setNamePrefix(type.getName()); return (FastClass)super.create(type.getName()); } - protected ClassLoader getDefaultClassLoader() { + @Override + protected ClassLoader getDefaultClassLoader() { return type.getClassLoader(); } - protected ProtectionDomain getProtectionDomain() { + @Override + protected ProtectionDomain getProtectionDomain() { return ReflectUtils.getProtectionDomain(type); } - public void generateClass(ClassVisitor v) throws Exception { + @Override + public void generateClass(ClassVisitor v) throws Exception { new FastClassEmitter(v, getClassName(), type); } - protected Object firstInstance(Class type) { + @Override + protected Object firstInstance(Class type) { return ReflectUtils.newInstance(type, new Class[]{ Class.class }, new Object[]{ this.type }); } - protected Object nextInstance(Object instance) { + @Override + protected Object nextInstance(Object instance) { return instance; } } - + public Object invoke(String name, Class[] parameterTypes, Object obj, Object[] args) throws InvocationTargetException { return invoke(getIndex(name, parameterTypes), obj, args); } @@ -100,7 +109,7 @@ abstract public class FastClass public Object newInstance(Class[] parameterTypes, Object[] args) throws InvocationTargetException { return newInstance(getIndex(parameterTypes), args); } - + public FastMethod getMethod(Method method) { return new FastMethod(this, method); } @@ -133,15 +142,18 @@ abstract public class FastClass return type; } - public String toString() { + @Override + public String toString() { return type.toString(); } - public int hashCode() { + @Override + public int hashCode() { return type.hashCode(); } - public boolean equals(Object o) { + @Override + public boolean equals(Object o) { if (o == null || !(o instanceof FastClass)) { return false; } @@ -199,8 +211,8 @@ abstract public class FastClass StringBuilder sb = new StringBuilder(); sb.append(name); sb.append('('); - for (int i = 0; i < parameterTypes.length; i++) { - sb.append(Type.getDescriptor(parameterTypes[i])); + for (Class parameterType : parameterTypes) { + sb.append(Type.getDescriptor(parameterType)); } sb.append(')'); return sb.toString(); diff --git a/spring-core/src/main/java/org/springframework/cglib/reflect/FastClassEmitter.java b/spring-core/src/main/java/org/springframework/cglib/reflect/FastClassEmitter.java index 11b45ea19de..4e5ba38b5c1 100644 --- a/spring-core/src/main/java/org/springframework/cglib/reflect/FastClassEmitter.java +++ b/spring-core/src/main/java/org/springframework/cglib/reflect/FastClassEmitter.java @@ -13,14 +13,35 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.cglib.reflect; -import java.lang.reflect.*; -import java.util.*; -import org.springframework.cglib.core.*; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + import org.springframework.asm.ClassVisitor; import org.springframework.asm.Label; import org.springframework.asm.Type; +import org.springframework.cglib.core.Block; +import org.springframework.cglib.core.ClassEmitter; +import org.springframework.cglib.core.CodeEmitter; +import org.springframework.cglib.core.CollectionUtils; +import org.springframework.cglib.core.Constants; +import org.springframework.cglib.core.DuplicatesPredicate; +import org.springframework.cglib.core.EmitUtils; +import org.springframework.cglib.core.MethodInfo; +import org.springframework.cglib.core.MethodInfoTransformer; +import org.springframework.cglib.core.ObjectSwitchCallback; +import org.springframework.cglib.core.ProcessSwitchCallback; +import org.springframework.cglib.core.ReflectUtils; +import org.springframework.cglib.core.Signature; +import org.springframework.cglib.core.TypeUtils; +import org.springframework.cglib.core.VisibilityPredicate; @SuppressWarnings({"rawtypes", "unchecked", "deprecation"}) class FastClassEmitter extends ClassEmitter { @@ -49,7 +70,7 @@ class FastClassEmitter extends ClassEmitter { private static final Type INVOCATION_TARGET_EXCEPTION = TypeUtils.parseType("java.lang.reflect.InvocationTargetException"); private static final Type[] INVOCATION_TARGET_EXCEPTION_ARRAY = { INVOCATION_TARGET_EXCEPTION }; - + public FastClassEmitter(ClassVisitor v, String className, Class type) { super(v); @@ -70,13 +91,13 @@ class FastClassEmitter extends ClassEmitter { CollectionUtils.filter(methods, new DuplicatesPredicate()); List constructors = new ArrayList(Arrays.asList(type.getDeclaredConstructors())); CollectionUtils.filter(constructors, vp); - + // getIndex(String) emitIndexBySignature(methods); // getIndex(String, Class[]) emitIndexByClassArray(methods); - + // getIndex(Class[]) e = begin_method(Constants.ACC_PUBLIC, CONSTRUCTOR_GET_INDEX, null); e.load_args(); @@ -112,11 +133,7 @@ class FastClassEmitter extends ClassEmitter { // TODO: support constructor indices ("") private void emitIndexBySignature(List methods) { CodeEmitter e = begin_method(Constants.ACC_PUBLIC, SIGNATURE_GET_INDEX, null); - List signatures = CollectionUtils.transform(methods, new Transformer() { - public Object transform(Object obj) { - return ReflectUtils.getSignature((Method)obj).toString(); - } - }); + List signatures = CollectionUtils.transform(methods, obj -> ReflectUtils.getSignature((Method)obj).toString()); e.load_arg(0); e.invoke_virtual(Constants.TYPE_OBJECT, TO_STRING); signatureSwitchHelper(e, signatures); @@ -128,12 +145,10 @@ class FastClassEmitter extends ClassEmitter { CodeEmitter e = begin_method(Constants.ACC_PUBLIC, METHOD_GET_INDEX, null); if (methods.size() > TOO_MANY_METHODS) { // hack for big classes - List signatures = CollectionUtils.transform(methods, new Transformer() { - public Object transform(Object obj) { - String s = ReflectUtils.getSignature((Method)obj).toString(); - return s.substring(0, s.lastIndexOf(')') + 1); - } - }); + List signatures = CollectionUtils.transform(methods, obj -> { + String s = ReflectUtils.getSignature((Method)obj).toString(); + return s.substring(0, s.lastIndexOf(')') + 1); + }); e.load_args(); e.invoke_static(FAST_CLASS, GET_SIGNATURE_WITHOUT_RETURN_TYPE); signatureSwitchHelper(e, signatures); @@ -147,12 +162,14 @@ class FastClassEmitter extends ClassEmitter { private void signatureSwitchHelper(final CodeEmitter e, final List signatures) { ObjectSwitchCallback callback = new ObjectSwitchCallback() { - public void processCase(Object key, Label end) { + @Override + public void processCase(Object key, Label end) { // TODO: remove linear indexOf e.push(signatures.indexOf(key)); e.return_value(); } - public void processDefault() { + @Override + public void processDefault() { e.push(-1); e.return_value(); } @@ -164,11 +181,12 @@ class FastClassEmitter extends ClassEmitter { } private static void invokeSwitchHelper(final CodeEmitter e, List members, final int arg, final Type base) { - final List info = CollectionUtils.transform(members, MethodInfoTransformer.getInstance()); + final List info = CollectionUtils.transform(members, MethodInfoTransformer.getInstance()); final Label illegalArg = e.make_label(); Block block = e.begin_block(); e.process_switch(getIntRange(info.size()), new ProcessSwitchCallback() { - public void processCase(int key, Label end) { + @Override + public void processCase(int key, Label end) { MethodInfo method = (MethodInfo)info.get(key); Type[] types = method.getSignature().getArgumentTypes(); for (int i = 0; i < types.length; i++) { @@ -184,7 +202,8 @@ class FastClassEmitter extends ClassEmitter { } e.return_value(); } - public void processDefault() { + @Override + public void processDefault() { e.goTo(illegalArg); } }); @@ -205,18 +224,20 @@ class FastClassEmitter extends ClassEmitter { indexes.put(it.next(), index++); } } - - public void processCase(Object key, Label end) { + + @Override + public void processCase(Object key, Label end) { e.push(((Integer)indexes.get(key))); e.return_value(); } - - public void processDefault() { + + @Override + public void processDefault() { e.push(-1); e.return_value(); } } - + private static int[] getIntRange(int length) { int[] range = new int[length]; for (int i = 0; i < length; i++) { diff --git a/spring-core/src/main/java/org/springframework/cglib/reflect/FastConstructor.java b/spring-core/src/main/java/org/springframework/cglib/reflect/FastConstructor.java index b3735dd1411..fb18fe71445 100644 --- a/spring-core/src/main/java/org/springframework/cglib/reflect/FastConstructor.java +++ b/spring-core/src/main/java/org/springframework/cglib/reflect/FastConstructor.java @@ -25,11 +25,13 @@ public class FastConstructor extends FastMember super(fc, constructor, fc.getIndex(constructor.getParameterTypes())); } - public Class[] getParameterTypes() { + @Override + public Class[] getParameterTypes() { return ((Constructor)member).getParameterTypes(); } - public Class[] getExceptionTypes() { + @Override + public Class[] getExceptionTypes() { return ((Constructor)member).getExceptionTypes(); } diff --git a/spring-core/src/main/java/org/springframework/cglib/reflect/FastMember.java b/spring-core/src/main/java/org/springframework/cglib/reflect/FastMember.java index f6c3ca7e5b0..fffea00ae4a 100644 --- a/spring-core/src/main/java/org/springframework/cglib/reflect/FastMember.java +++ b/spring-core/src/main/java/org/springframework/cglib/reflect/FastMember.java @@ -49,18 +49,22 @@ abstract public class FastMember return member.getModifiers(); } + @Override public String toString() { return member.toString(); } + @Override public int hashCode() { return member.hashCode(); } + @Override public boolean equals(Object o) { - if (o == null || !(o instanceof FastMember)) { + if (o == null || !(o instanceof FastMember other)) { return false; } - return member.equals(((FastMember)o).member); + return member.equals(other.member); } + } diff --git a/spring-core/src/main/java/org/springframework/cglib/reflect/FastMethod.java b/spring-core/src/main/java/org/springframework/cglib/reflect/FastMethod.java index 323919298a6..f0ec02b390a 100644 --- a/spring-core/src/main/java/org/springframework/cglib/reflect/FastMethod.java +++ b/spring-core/src/main/java/org/springframework/cglib/reflect/FastMethod.java @@ -18,9 +18,8 @@ package org.springframework.cglib.reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import org.springframework.cglib.core.Signature; - import org.springframework.asm.Type; +import org.springframework.cglib.core.Signature; @SuppressWarnings({"rawtypes", "unchecked"}) public class FastMethod extends FastMember @@ -46,11 +45,13 @@ public class FastMethod extends FastMember return ((Method)member).getReturnType(); } - public Class[] getParameterTypes() { + @Override + public Class[] getParameterTypes() { return ((Method)member).getParameterTypes(); } - public Class[] getExceptionTypes() { + @Override + public Class[] getExceptionTypes() { return ((Method)member).getExceptionTypes(); } diff --git a/spring-core/src/main/java/org/springframework/cglib/reflect/MulticastDelegate.java b/spring-core/src/main/java/org/springframework/cglib/reflect/MulticastDelegate.java index 7271442c3d1..b23a8b17207 100644 --- a/spring-core/src/main/java/org/springframework/cglib/reflect/MulticastDelegate.java +++ b/spring-core/src/main/java/org/springframework/cglib/reflect/MulticastDelegate.java @@ -30,7 +30,6 @@ import org.springframework.cglib.core.Constants; import org.springframework.cglib.core.EmitUtils; import org.springframework.cglib.core.Local; import org.springframework.cglib.core.MethodInfo; -import org.springframework.cglib.core.ProcessArrayCallback; import org.springframework.cglib.core.ReflectUtils; import org.springframework.cglib.core.Signature; import org.springframework.cglib.core.TypeUtils; @@ -166,17 +165,14 @@ abstract public class MulticastDelegate implements Cloneable { e.load_this(); e.super_getfield("targets", Constants.TYPE_OBJECT_ARRAY); final Local result2 = result; - EmitUtils.process_array(e, Constants.TYPE_OBJECT_ARRAY, new ProcessArrayCallback() { - @Override - public void processElement(Type type) { - e.checkcast(Type.getType(iface)); - e.load_args(); - e.invoke(method); - if (returns) { - e.store_local(result2); - } - } - }); + EmitUtils.process_array(e, Constants.TYPE_OBJECT_ARRAY, type -> { + e.checkcast(Type.getType(iface)); + e.load_args(); + e.invoke(method); + if (returns) { + e.store_local(result2); + } + }); if (returns) { e.load_local(result); } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassFilterTransformer.java b/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassFilterTransformer.java index d3e055485cc..a9de1633a53 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassFilterTransformer.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassFilterTransformer.java @@ -26,7 +26,8 @@ abstract public class AbstractClassFilterTransformer extends AbstractClassTransf private ClassTransformer pass; private ClassVisitor target; - public void setTarget(ClassVisitor target) { + @Override + public void setTarget(ClassVisitor target) { super.setTarget(target); pass.setTarget(target); } @@ -37,7 +38,8 @@ abstract public class AbstractClassFilterTransformer extends AbstractClassTransf abstract protected boolean accept(int version, int access, String name, String signature, String superName, String[] interfaces); - public void visit(int version, + @Override + public void visit(int version, int access, String name, String signature, @@ -46,36 +48,43 @@ abstract public class AbstractClassFilterTransformer extends AbstractClassTransf target = accept(version, access, name, signature, superName, interfaces) ? pass : cv; target.visit(version, access, name, signature, superName, interfaces); } - - public void visitSource(String source, String debug) { + + @Override + public void visitSource(String source, String debug) { target.visitSource(source, debug); } - - public void visitOuterClass(String owner, String name, String desc) { + + @Override + public void visitOuterClass(String owner, String name, String desc) { target.visitOuterClass(owner, name, desc); } - - public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + + @Override + public AnnotationVisitor visitAnnotation(String desc, boolean visible) { return target.visitAnnotation(desc, visible); } - - public void visitAttribute(Attribute attr) { + + @Override + public void visitAttribute(Attribute attr) { target.visitAttribute(attr); } - - public void visitInnerClass(String name, String outerName, String innerName, int access) { + + @Override + public void visitInnerClass(String name, String outerName, String innerName, int access) { target.visitInnerClass(name, outerName, innerName, access); } - public FieldVisitor visitField(int access, + @Override + public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { return target.visitField(access, name, desc, signature, value); } - - public MethodVisitor visitMethod(int access, + + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, @@ -83,7 +92,8 @@ abstract public class AbstractClassFilterTransformer extends AbstractClassTransf return target.visitMethod(access, name, desc, signature, exceptions); } - public void visitEnd() { + @Override + public void visitEnd() { target.visitEnd(); target = null; // just to be safe } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassLoader.java b/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassLoader.java index 293037bb9a3..b4a7583970f 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassLoader.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassLoader.java @@ -15,80 +15,79 @@ */ package org.springframework.cglib.transform; -import org.springframework.cglib.core.CodeGenerationException; -import org.springframework.cglib.core.ClassGenerator; -import org.springframework.cglib.core.DebuggingClassWriter; +import java.io.IOException; + +import org.springframework.asm.Attribute; import org.springframework.asm.ClassReader; import org.springframework.asm.ClassWriter; -import org.springframework.asm.Attribute; - -import java.io.IOException; +import org.springframework.cglib.core.ClassGenerator; +import org.springframework.cglib.core.CodeGenerationException; +import org.springframework.cglib.core.DebuggingClassWriter; @SuppressWarnings({"rawtypes", "unchecked"}) abstract public class AbstractClassLoader extends ClassLoader { private ClassFilter filter; private ClassLoader classPath; private static java.security.ProtectionDomain DOMAIN ; - + static{ DOMAIN = AbstractClassLoader.class.getProtectionDomain(); } - + protected AbstractClassLoader(ClassLoader parent, ClassLoader classPath, ClassFilter filter) { super(parent); this.filter = filter; this.classPath = classPath; } - public Class loadClass(String name) throws ClassNotFoundException { - + @Override + public Class loadClass(String name) throws ClassNotFoundException { + Class loaded = findLoadedClass(name); - + if( loaded != null ){ if( loaded.getClassLoader() == this ){ return loaded; }//else reload with this class loader } - + if (!filter.accept(name)) { return super.loadClass(name); } ClassReader r; try { - - java.io.InputStream is = classPath.getResourceAsStream( + + java.io.InputStream is = classPath.getResourceAsStream( name.replace('.','/') + ".class" - ); - + ); + if (is == null) { - + throw new ClassNotFoundException(name); - + } - try { - + try { + r = new ClassReader(is); - + } finally { - + is.close(); - + } } catch (IOException e) { throw new ClassNotFoundException(name + ":" + e.getMessage()); } try { - DebuggingClassWriter w = + DebuggingClassWriter w = new DebuggingClassWriter(ClassWriter.COMPUTE_FRAMES); getGenerator(r).generateClass(w); byte[] b = w.toByteArray(); Class c = super.defineClass(name, b, 0, b.length, DOMAIN); postProcess(c); return c; - } catch (RuntimeException e) { - throw e; - } catch (Error e) { + } catch (RuntimeException | Error e) { throw e; } catch (Exception e) { throw new CodeGenerationException(e); @@ -102,7 +101,7 @@ abstract public class AbstractClassLoader extends ClassLoader { protected int getFlags() { return 0; } - + protected Attribute[] attributes() { return null; } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassTransformer.java b/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassTransformer.java index 954204fda4b..140013aafdd 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassTransformer.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassTransformer.java @@ -15,16 +15,17 @@ */ package org.springframework.cglib.transform; +import org.springframework.asm.ClassVisitor; import org.springframework.cglib.core.ClassTransformer; import org.springframework.cglib.core.Constants; -import org.springframework.asm.ClassVisitor; abstract public class AbstractClassTransformer extends ClassTransformer { protected AbstractClassTransformer() { super(Constants.ASM_API); } - public void setTarget(ClassVisitor target) { + @Override + public void setTarget(ClassVisitor target) { cv = target; } } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/AnnotationVisitorTee.java b/spring-core/src/main/java/org/springframework/cglib/transform/AnnotationVisitorTee.java index f194d9a0378..3c6bcb621b9 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/AnnotationVisitorTee.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/AnnotationVisitorTee.java @@ -15,17 +15,19 @@ */ package org.springframework.cglib.transform; -import org.springframework.cglib.core.Constants; import org.springframework.asm.AnnotationVisitor; +import org.springframework.cglib.core.Constants; public class AnnotationVisitorTee extends AnnotationVisitor { private AnnotationVisitor av1, av2; public static AnnotationVisitor getInstance(AnnotationVisitor av1, AnnotationVisitor av2) { - if (av1 == null) - return av2; - if (av2 == null) - return av1; + if (av1 == null) { + return av2; + } + if (av2 == null) { + return av1; + } return new AnnotationVisitorTee(av1, av2); } @@ -35,26 +37,31 @@ public class AnnotationVisitorTee extends AnnotationVisitor { this.av2 = av2; } - public void visit(String name, Object value) { + @Override + public void visit(String name, Object value) { av2.visit(name, value); av2.visit(name, value); } - - public void visitEnum(String name, String desc, String value) { + + @Override + public void visitEnum(String name, String desc, String value) { av1.visitEnum(name, desc, value); av2.visitEnum(name, desc, value); } - - public AnnotationVisitor visitAnnotation(String name, String desc) { + + @Override + public AnnotationVisitor visitAnnotation(String name, String desc) { return getInstance(av1.visitAnnotation(name, desc), av2.visitAnnotation(name, desc)); } - - public AnnotationVisitor visitArray(String name) { + + @Override + public AnnotationVisitor visitArray(String name) { return getInstance(av1.visitArray(name), av2.visitArray(name)); } - - public void visitEnd() { + + @Override + public void visitEnd() { av1.visitEnd(); av2.visitEnd(); } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/ClassFilter.java b/spring-core/src/main/java/org/springframework/cglib/transform/ClassFilter.java index adb63550fd4..951b4c59676 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/ClassFilter.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/ClassFilter.java @@ -21,7 +21,7 @@ package org.springframework.cglib.transform; * @author baliuka */ public interface ClassFilter { - + boolean accept(String className); - + } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/ClassReaderGenerator.java b/spring-core/src/main/java/org/springframework/cglib/transform/ClassReaderGenerator.java index 152d4089dee..2ec9c5d0ea9 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/ClassReaderGenerator.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/ClassReaderGenerator.java @@ -15,16 +15,16 @@ */ package org.springframework.cglib.transform; -import org.springframework.cglib.core.ClassGenerator; import org.springframework.asm.Attribute; import org.springframework.asm.ClassReader; import org.springframework.asm.ClassVisitor; +import org.springframework.cglib.core.ClassGenerator; public class ClassReaderGenerator implements ClassGenerator { private final ClassReader r; private final Attribute[] attrs; private final int flags; - + public ClassReaderGenerator(ClassReader r, int flags) { this(r, null, flags); } @@ -34,8 +34,9 @@ public class ClassReaderGenerator implements ClassGenerator { this.attrs = (attrs != null) ? attrs : new Attribute[0]; this.flags = flags; } - - public void generateClass(ClassVisitor v) { + + @Override + public void generateClass(ClassVisitor v) { r.accept(v, attrs, flags); } } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/ClassTransformerChain.java b/spring-core/src/main/java/org/springframework/cglib/transform/ClassTransformerChain.java index c68160beb3e..3a466c0fc95 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/ClassTransformerChain.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/ClassTransformerChain.java @@ -21,12 +21,13 @@ import org.springframework.cglib.core.ClassTransformer; public class ClassTransformerChain extends AbstractClassTransformer { private ClassTransformer[] chain; - + public ClassTransformerChain(ClassTransformer[] chain) { this.chain = chain.clone(); } - public void setTarget(ClassVisitor v) { + @Override + public void setTarget(ClassVisitor v) { super.setTarget(chain[0]); ClassVisitor next = v; for (int i = chain.length - 1; i >= 0; i--) { @@ -35,7 +36,8 @@ public class ClassTransformerChain extends AbstractClassTransformer { } } - public MethodVisitor visitMethod(int access, + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, @@ -43,7 +45,8 @@ public class ClassTransformerChain extends AbstractClassTransformer { return cv.visitMethod(access, name, desc, signature, exceptions); } - public String toString() { + @Override + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("ClassTransformerChain{"); for (int i = 0; i < chain.length; i++) { diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/ClassTransformerTee.java b/spring-core/src/main/java/org/springframework/cglib/transform/ClassTransformerTee.java index a4572fe4065..afcbbc88e22 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/ClassTransformerTee.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/ClassTransformerTee.java @@ -15,19 +15,20 @@ */ package org.springframework.cglib.transform; +import org.springframework.asm.ClassVisitor; import org.springframework.cglib.core.ClassTransformer; import org.springframework.cglib.core.Constants; -import org.springframework.asm.ClassVisitor; public class ClassTransformerTee extends ClassTransformer { private ClassVisitor branch; - + public ClassTransformerTee(ClassVisitor branch) { super(Constants.ASM_API); this.branch = branch; } - - public void setTarget(ClassVisitor target) { + + @Override + public void setTarget(ClassVisitor target) { cv = new ClassVisitorTee(branch, target); } } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/ClassVisitorTee.java b/spring-core/src/main/java/org/springframework/cglib/transform/ClassVisitorTee.java index 638d320e1f9..44f38dd627b 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/ClassVisitorTee.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/ClassVisitorTee.java @@ -25,14 +25,15 @@ import org.springframework.cglib.core.Constants; public class ClassVisitorTee extends ClassVisitor { private ClassVisitor cv1, cv2; - + public ClassVisitorTee(ClassVisitor cv1, ClassVisitor cv2) { super(Constants.ASM_API); this.cv1 = cv1; this.cv2 = cv2; } - public void visit(int version, + @Override + public void visit(int version, int access, String name, String signature, @@ -42,67 +43,80 @@ public class ClassVisitorTee extends ClassVisitor { cv2.visit(version, access, name, signature, superName, interfaces); } - public void visitEnd() { + @Override + public void visitEnd() { cv1.visitEnd(); cv2.visitEnd(); cv1 = cv2 = null; } - public void visitInnerClass(String name, String outerName, String innerName, int access) { + @Override + public void visitInnerClass(String name, String outerName, String innerName, int access) { cv1.visitInnerClass(name, outerName, innerName, access); cv2.visitInnerClass(name, outerName, innerName, access); } - public FieldVisitor visitField(int access, + @Override + public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { FieldVisitor fv1 = cv1.visitField(access, name, desc, signature, value); FieldVisitor fv2 = cv2.visitField(access, name, desc, signature, value); - if (fv1 == null) - return fv2; - if (fv2 == null) - return fv1; + if (fv1 == null) { + return fv2; + } + if (fv2 == null) { + return fv1; + } return new FieldVisitorTee(fv1, fv2); } - public MethodVisitor visitMethod(int access, + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv1 = cv1.visitMethod(access, name, desc, signature, exceptions); MethodVisitor mv2 = cv2.visitMethod(access, name, desc, signature, exceptions); - if (mv1 == null) - return mv2; - if (mv2 == null) - return mv1; + if (mv1 == null) { + return mv2; + } + if (mv2 == null) { + return mv1; + } return new MethodVisitorTee(mv1, mv2); } - public void visitSource(String source, String debug) { + @Override + public void visitSource(String source, String debug) { cv1.visitSource(source, debug); cv2.visitSource(source, debug); } - public void visitOuterClass(String owner, String name, String desc) { + @Override + public void visitOuterClass(String owner, String name, String desc) { cv1.visitOuterClass(owner, name, desc); cv2.visitOuterClass(owner, name, desc); } - public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + @Override + public AnnotationVisitor visitAnnotation(String desc, boolean visible) { return AnnotationVisitorTee.getInstance(cv1.visitAnnotation(desc, visible), cv2.visitAnnotation(desc, visible)); } - - public void visitAttribute(Attribute attrs) { + + @Override + public void visitAttribute(Attribute attrs) { cv1.visitAttribute(attrs); cv2.visitAttribute(attrs); } - public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { + @Override + public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { return AnnotationVisitorTee.getInstance(cv1.visitTypeAnnotation(typeRef, typePath, desc, visible), cv2.visitTypeAnnotation(typeRef, typePath, desc, visible)); } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/FieldVisitorTee.java b/spring-core/src/main/java/org/springframework/cglib/transform/FieldVisitorTee.java index a6c538099d9..b58496d5d92 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/FieldVisitorTee.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/FieldVisitorTee.java @@ -15,37 +15,41 @@ */ package org.springframework.cglib.transform; -import org.springframework.cglib.core.Constants; import org.springframework.asm.AnnotationVisitor; import org.springframework.asm.Attribute; import org.springframework.asm.FieldVisitor; import org.springframework.asm.TypePath; +import org.springframework.cglib.core.Constants; public class FieldVisitorTee extends FieldVisitor { private FieldVisitor fv1, fv2; - + public FieldVisitorTee(FieldVisitor fv1, FieldVisitor fv2) { super(Constants.ASM_API); this.fv1 = fv1; this.fv2 = fv2; } - public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + @Override + public AnnotationVisitor visitAnnotation(String desc, boolean visible) { return AnnotationVisitorTee.getInstance(fv1.visitAnnotation(desc, visible), fv2.visitAnnotation(desc, visible)); } - - public void visitAttribute(Attribute attr) { + + @Override + public void visitAttribute(Attribute attr) { fv1.visitAttribute(attr); fv2.visitAttribute(attr); } - public void visitEnd() { + @Override + public void visitEnd() { fv1.visitEnd(); fv2.visitEnd(); } - public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { + @Override + public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { return AnnotationVisitorTee.getInstance(fv1.visitTypeAnnotation(typeRef, typePath, desc, visible), fv2.visitTypeAnnotation(typeRef, typePath, desc, visible)); } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/MethodFilterTransformer.java b/spring-core/src/main/java/org/springframework/cglib/transform/MethodFilterTransformer.java index 615331ea506..4953b4b0b1c 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/MethodFilterTransformer.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/MethodFilterTransformer.java @@ -23,22 +23,24 @@ public class MethodFilterTransformer extends AbstractClassTransformer { private MethodFilter filter; private ClassTransformer pass; private ClassVisitor direct; - + public MethodFilterTransformer(MethodFilter filter, ClassTransformer pass) { this.filter = filter; this.pass = pass; super.setTarget(pass); } - public MethodVisitor visitMethod(int access, + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { return (filter.accept(access, name, desc, signature, exceptions) ? pass : direct).visitMethod(access, name, desc, signature, exceptions); } - - public void setTarget(ClassVisitor target) { + + @Override + public void setTarget(ClassVisitor target) { pass.setTarget(target); direct = target; } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/MethodVisitorTee.java b/spring-core/src/main/java/org/springframework/cglib/transform/MethodVisitorTee.java index c0e60c57da2..05560194d07 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/MethodVisitorTee.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/MethodVisitorTee.java @@ -27,166 +27,197 @@ import org.springframework.cglib.core.Constants; public class MethodVisitorTee extends MethodVisitor { private final MethodVisitor mv1; private final MethodVisitor mv2; - + public MethodVisitorTee(MethodVisitor mv1, MethodVisitor mv2) { super(Constants.ASM_API); this.mv1 = mv1; this.mv2 = mv2; } - public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) { + @Override + public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) { mv1.visitFrame(type, nLocal, local, nStack, stack); mv2.visitFrame(type, nLocal, local, nStack, stack); } - public AnnotationVisitor visitAnnotationDefault() { + @Override + public AnnotationVisitor visitAnnotationDefault() { return AnnotationVisitorTee.getInstance(mv1.visitAnnotationDefault(), mv2.visitAnnotationDefault()); } - - public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + + @Override + public AnnotationVisitor visitAnnotation(String desc, boolean visible) { return AnnotationVisitorTee.getInstance(mv1.visitAnnotation(desc, visible), mv2.visitAnnotation(desc, visible)); } - - public AnnotationVisitor visitParameterAnnotation(int parameter, + + @Override + public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) { return AnnotationVisitorTee.getInstance(mv1.visitParameterAnnotation(parameter, desc, visible), mv2.visitParameterAnnotation(parameter, desc, visible)); } - public void visitAttribute(Attribute attr) { + @Override + public void visitAttribute(Attribute attr) { mv1.visitAttribute(attr); mv2.visitAttribute(attr); } - - public void visitCode() { + + @Override + public void visitCode() { mv1.visitCode(); mv2.visitCode(); } - - public void visitInsn(int opcode) { + + @Override + public void visitInsn(int opcode) { mv1.visitInsn(opcode); mv2.visitInsn(opcode); } - - public void visitIntInsn(int opcode, int operand) { + + @Override + public void visitIntInsn(int opcode, int operand) { mv1.visitIntInsn(opcode, operand); mv2.visitIntInsn(opcode, operand); } - - public void visitVarInsn(int opcode, int var) { + + @Override + public void visitVarInsn(int opcode, int var) { mv1.visitVarInsn(opcode, var); mv2.visitVarInsn(opcode, var); } - - public void visitTypeInsn(int opcode, String desc) { + + @Override + public void visitTypeInsn(int opcode, String desc) { mv1.visitTypeInsn(opcode, desc); mv2.visitTypeInsn(opcode, desc); } - - public void visitFieldInsn(int opcode, String owner, String name, String desc) { + + @Override + public void visitFieldInsn(int opcode, String owner, String name, String desc) { mv1.visitFieldInsn(opcode, owner, name, desc); mv2.visitFieldInsn(opcode, owner, name, desc); } - public void visitMethodInsn(int opcode, String owner, String name, String desc) { + @Override + public void visitMethodInsn(int opcode, String owner, String name, String desc) { mv1.visitMethodInsn(opcode, owner, name, desc); mv2.visitMethodInsn(opcode, owner, name, desc); } - public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { + @Override + public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { mv1.visitMethodInsn(opcode, owner, name, desc, itf); mv2.visitMethodInsn(opcode, owner, name, desc, itf); } - - public void visitJumpInsn(int opcode, Label label) { + + @Override + public void visitJumpInsn(int opcode, Label label) { mv1.visitJumpInsn(opcode, label); mv2.visitJumpInsn(opcode, label); } - - public void visitLabel(Label label) { + + @Override + public void visitLabel(Label label) { mv1.visitLabel(label); mv2.visitLabel(label); } - - public void visitLdcInsn(Object cst) { + + @Override + public void visitLdcInsn(Object cst) { mv1.visitLdcInsn(cst); mv2.visitLdcInsn(cst); } - - public void visitIincInsn(int var, int increment) { + + @Override + public void visitIincInsn(int var, int increment) { mv1.visitIincInsn(var, increment); mv2.visitIincInsn(var, increment); } - - public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) { + + @Override + public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) { mv1.visitTableSwitchInsn(min, max, dflt, labels); mv2.visitTableSwitchInsn(min, max, dflt, labels); } - - public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) { + + @Override + public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) { mv1.visitLookupSwitchInsn(dflt, keys, labels); mv2.visitLookupSwitchInsn(dflt, keys, labels); } - - public void visitMultiANewArrayInsn(String desc, int dims) { + + @Override + public void visitMultiANewArrayInsn(String desc, int dims) { mv1.visitMultiANewArrayInsn(desc, dims); mv2.visitMultiANewArrayInsn(desc, dims); } - - public void visitTryCatchBlock(Label start, Label end, Label handler, String type) { + + @Override + public void visitTryCatchBlock(Label start, Label end, Label handler, String type) { mv1.visitTryCatchBlock(start, end, handler, type); mv2.visitTryCatchBlock(start, end, handler, type); } - - public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { + + @Override + public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { mv1.visitLocalVariable(name, desc, signature, start, end, index); mv2.visitLocalVariable(name, desc, signature, start, end, index); } - - public void visitLineNumber(int line, Label start) { + + @Override + public void visitLineNumber(int line, Label start) { mv1.visitLineNumber(line, start); mv2.visitLineNumber(line, start); } - - public void visitMaxs(int maxStack, int maxLocals) { + + @Override + public void visitMaxs(int maxStack, int maxLocals) { mv1.visitMaxs(maxStack, maxLocals); mv2.visitMaxs(maxStack, maxLocals); } - - public void visitEnd() { + + @Override + public void visitEnd() { mv1.visitEnd(); mv2.visitEnd(); } - public void visitParameter(String name, int access) { + @Override + public void visitParameter(String name, int access) { mv1.visitParameter(name, access); mv2.visitParameter(name, access); } - public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { + @Override + public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { return AnnotationVisitorTee.getInstance(mv1.visitTypeAnnotation(typeRef, typePath, desc, visible), mv2.visitTypeAnnotation(typeRef, typePath, desc, visible)); } - public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { + @Override + public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { mv1.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); mv2.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); } - public AnnotationVisitor visitInsnAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { + @Override + public AnnotationVisitor visitInsnAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { return AnnotationVisitorTee.getInstance(mv1.visitInsnAnnotation(typeRef, typePath, desc, visible), mv2.visitInsnAnnotation(typeRef, typePath, desc, visible)); } - public AnnotationVisitor visitTryCatchAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { + @Override + public AnnotationVisitor visitTryCatchAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { return AnnotationVisitorTee.getInstance(mv1.visitTryCatchAnnotation(typeRef, typePath, desc, visible), mv2.visitTryCatchAnnotation(typeRef, typePath, desc, visible)); } - public AnnotationVisitor visitLocalVariableAnnotation(int typeRef, TypePath typePath, Label[] start, Label[] end, int[] index, String desc, boolean visible) { + @Override + public AnnotationVisitor visitLocalVariableAnnotation(int typeRef, TypePath typePath, Label[] start, Label[] end, int[] index, String desc, boolean visible) { return AnnotationVisitorTee.getInstance(mv1.visitLocalVariableAnnotation(typeRef, typePath, start, end, index, desc, visible), mv2.visitLocalVariableAnnotation(typeRef, typePath, start, end, index, desc, visible)); } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/impl/AbstractInterceptFieldCallback.java b/spring-core/src/main/java/org/springframework/cglib/transform/impl/AbstractInterceptFieldCallback.java index 3ac5bcc3608..e284ddd64dc 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/impl/AbstractInterceptFieldCallback.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/impl/AbstractInterceptFieldCallback.java @@ -19,24 +19,42 @@ package org.springframework.cglib.transform.impl; * @author Chris Nokleberg */ public class AbstractInterceptFieldCallback implements InterceptFieldCallback { - - public int writeInt(Object obj, String name, int oldValue, int newValue) { return newValue; } - public char writeChar(Object obj, String name, char oldValue, char newValue) { return newValue; } - public byte writeByte(Object obj, String name, byte oldValue, byte newValue) { return newValue; } - public boolean writeBoolean(Object obj, String name, boolean oldValue, boolean newValue) { return newValue; } - public short writeShort(Object obj, String name, short oldValue, short newValue) { return newValue; } - public float writeFloat(Object obj, String name, float oldValue, float newValue) { return newValue; } - public double writeDouble(Object obj, String name, double oldValue, double newValue) { return newValue; } - public long writeLong(Object obj, String name, long oldValue, long newValue) { return newValue; } - public Object writeObject(Object obj, String name, Object oldValue, Object newValue) { return newValue; } - public int readInt(Object obj, String name, int oldValue) { return oldValue; } - public char readChar(Object obj, String name, char oldValue) { return oldValue; } - public byte readByte(Object obj, String name, byte oldValue) { return oldValue; } - public boolean readBoolean(Object obj, String name, boolean oldValue) { return oldValue; } - public short readShort(Object obj, String name, short oldValue) { return oldValue; } - public float readFloat(Object obj, String name, float oldValue) { return oldValue; } - public double readDouble(Object obj, String name, double oldValue) { return oldValue; } - public long readLong(Object obj, String name, long oldValue) { return oldValue; } - public Object readObject(Object obj, String name, Object oldValue) { return oldValue; } + @Override + public int writeInt(Object obj, String name, int oldValue, int newValue) { return newValue; } + @Override + public char writeChar(Object obj, String name, char oldValue, char newValue) { return newValue; } + @Override + public byte writeByte(Object obj, String name, byte oldValue, byte newValue) { return newValue; } + @Override + public boolean writeBoolean(Object obj, String name, boolean oldValue, boolean newValue) { return newValue; } + @Override + public short writeShort(Object obj, String name, short oldValue, short newValue) { return newValue; } + @Override + public float writeFloat(Object obj, String name, float oldValue, float newValue) { return newValue; } + @Override + public double writeDouble(Object obj, String name, double oldValue, double newValue) { return newValue; } + @Override + public long writeLong(Object obj, String name, long oldValue, long newValue) { return newValue; } + @Override + public Object writeObject(Object obj, String name, Object oldValue, Object newValue) { return newValue; } + + @Override + public int readInt(Object obj, String name, int oldValue) { return oldValue; } + @Override + public char readChar(Object obj, String name, char oldValue) { return oldValue; } + @Override + public byte readByte(Object obj, String name, byte oldValue) { return oldValue; } + @Override + public boolean readBoolean(Object obj, String name, boolean oldValue) { return oldValue; } + @Override + public short readShort(Object obj, String name, short oldValue) { return oldValue; } + @Override + public float readFloat(Object obj, String name, float oldValue) { return oldValue; } + @Override + public double readDouble(Object obj, String name, double oldValue) { return oldValue; } + @Override + public long readLong(Object obj, String name, long oldValue) { return oldValue; } + @Override + public Object readObject(Object obj, String name, Object oldValue) { return oldValue; } } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/impl/AddDelegateTransformer.java b/spring-core/src/main/java/org/springframework/cglib/transform/impl/AddDelegateTransformer.java index b0f70260ecf..4c36186f733 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/impl/AddDelegateTransformer.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/impl/AddDelegateTransformer.java @@ -65,11 +65,11 @@ public class AddDelegateTransformer extends ClassEmitterTransformer { DELEGATE, delegateType, null); - for (int i = 0; i < delegateIf.length; i++) { - Method[] methods = delegateIf[i].getMethods(); - for (int j = 0; j < methods.length; j++) { - if (Modifier.isAbstract(methods[j].getModifiers())) { - addDelegate(methods[j]); + for (Class element : delegateIf) { + Method[] methods = element.getMethods(); + for (Method method : methods) { + if (Modifier.isAbstract(method.getModifiers())) { + addDelegate(method); } } } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/impl/AddPropertyTransformer.java b/spring-core/src/main/java/org/springframework/cglib/transform/impl/AddPropertyTransformer.java index 7dd0c0db9b9..2d2018eb902 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/impl/AddPropertyTransformer.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/impl/AddPropertyTransformer.java @@ -15,10 +15,12 @@ */ package org.springframework.cglib.transform.impl; -import org.springframework.cglib.transform.*; -import java.util.*; -import org.springframework.cglib.core.*; +import java.util.Map; + import org.springframework.asm.Type; +import org.springframework.cglib.core.EmitUtils; +import org.springframework.cglib.core.TypeUtils; +import org.springframework.cglib.transform.ClassEmitterTransformer; @SuppressWarnings({"rawtypes", "unchecked"}) public class AddPropertyTransformer extends ClassEmitterTransformer { @@ -39,7 +41,8 @@ public class AddPropertyTransformer extends ClassEmitterTransformer { this.types = types; } - public void end_class() { + @Override + public void end_class() { if (!TypeUtils.isAbstract(getAccess())) { EmitUtils.add_properties(this, names, types); } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/impl/AddStaticInitTransformer.java b/spring-core/src/main/java/org/springframework/cglib/transform/impl/AddStaticInitTransformer.java index 6d8ae4cde39..df37c3838f3 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/impl/AddStaticInitTransformer.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/impl/AddStaticInitTransformer.java @@ -16,9 +16,15 @@ package org.springframework.cglib.transform.impl; import java.lang.reflect.Method; -import org.springframework.cglib.core.*; -import org.springframework.cglib.transform.*; + import org.springframework.asm.Type; +import org.springframework.cglib.core.CodeEmitter; +import org.springframework.cglib.core.Constants; +import org.springframework.cglib.core.EmitUtils; +import org.springframework.cglib.core.MethodInfo; +import org.springframework.cglib.core.ReflectUtils; +import org.springframework.cglib.core.TypeUtils; +import org.springframework.cglib.transform.ClassEmitterTransformer; /** * @author Juozas Baliuka, Chris Nokleberg @@ -39,7 +45,8 @@ public class AddStaticInitTransformer extends ClassEmitterTransformer { } } - protected void init() { + @Override + protected void init() { if (!TypeUtils.isInterface(getAccess())) { CodeEmitter e = getStaticHook(); EmitUtils.load_class_this(e); diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/impl/FieldProvider.java b/spring-core/src/main/java/org/springframework/cglib/transform/impl/FieldProvider.java index b85294fce77..25742e9be0a 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/impl/FieldProvider.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/impl/FieldProvider.java @@ -17,17 +17,17 @@ package org.springframework.cglib.transform.impl; @SuppressWarnings({"rawtypes", "unchecked"}) public interface FieldProvider { - + String[] getFieldNames(); - + Class[] getFieldTypes(); - + void setField(int index, Object value); - + Object getField(int index); void setField(String name, Object value); - + Object getField(String name); } diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/impl/InterceptFieldCallback.java b/spring-core/src/main/java/org/springframework/cglib/transform/impl/InterceptFieldCallback.java index 84225f5c9a2..aab136cb3a1 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/impl/InterceptFieldCallback.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/impl/InterceptFieldCallback.java @@ -19,7 +19,7 @@ package org.springframework.cglib.transform.impl; * @author Juozas Baliuka */ public interface InterceptFieldCallback { - + int writeInt(Object obj, String name, int oldValue, int newValue); char writeChar(Object obj, String name, char oldValue, char newValue); byte writeByte(Object obj, String name, byte oldValue, byte newValue); diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/impl/InterceptFieldTransformer.java b/spring-core/src/main/java/org/springframework/cglib/transform/impl/InterceptFieldTransformer.java index 2a68dbbb85c..837beb9d9a5 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/impl/InterceptFieldTransformer.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/impl/InterceptFieldTransformer.java @@ -15,10 +15,14 @@ */ package org.springframework.cglib.transform.impl; -import org.springframework.cglib.transform.*; -import org.springframework.cglib.core.*; import org.springframework.asm.Label; import org.springframework.asm.Type; +import org.springframework.cglib.core.CodeEmitter; +import org.springframework.cglib.core.Constants; +import org.springframework.cglib.core.Local; +import org.springframework.cglib.core.Signature; +import org.springframework.cglib.core.TypeUtils; +import org.springframework.cglib.transform.ClassEmitterTransformer; /** * @author Juozas Baliuka, Chris Nokleberg @@ -35,15 +39,16 @@ public class InterceptFieldTransformer extends ClassEmitterTransformer { new Signature("getInterceptFieldCallback", CALLBACK, new Type[0]); private InterceptFieldFilter filter; - + public InterceptFieldTransformer(InterceptFieldFilter filter) { this.filter = filter; } - - public void begin_class(int version, int access, String className, Type superType, Type[] interfaces, String sourceFile) { + + @Override + public void begin_class(int version, int access, String className, Type superType, Type[] interfaces, String sourceFile) { if (!TypeUtils.isInterface(access)) { super.begin_class(version, access, className, superType, TypeUtils.add(interfaces, ENABLED), sourceFile); - + super.declare_field(Constants.ACC_PRIVATE | Constants.ACC_TRANSIENT, CALLBACK_FIELD, CALLBACK, @@ -55,7 +60,7 @@ public class InterceptFieldTransformer extends ClassEmitterTransformer { e.getfield(CALLBACK_FIELD); e.return_value(); e.end_method(); - + e = super.begin_method(Constants.ACC_PUBLIC, ENABLED_SET, null); e.load_this(); e.load_arg(0); @@ -67,7 +72,8 @@ public class InterceptFieldTransformer extends ClassEmitterTransformer { } } - public void declare_field(int access, String name, Type type, Object value) { + @Override + public void declare_field(int access, String name, Type type, Object value) { super.declare_field(access, name, type, value); if (!TypeUtils.isStatic(access)) { if (filter.acceptRead(getClassType(), name)) { @@ -137,10 +143,12 @@ public class InterceptFieldTransformer extends ClassEmitterTransformer { e.return_value(); e.end_method(); } - - public CodeEmitter begin_method(int access, Signature sig, Type[] exceptions) { + + @Override + public CodeEmitter begin_method(int access, Signature sig, Type[] exceptions) { return new CodeEmitter(super.begin_method(access, sig, exceptions)) { - public void visitFieldInsn(int opcode, String owner, String name, String desc) { + @Override + public void visitFieldInsn(int opcode, String owner, String name, String desc) { Type towner = TypeUtils.fromInternalName(owner); switch (opcode) { case Constants.GETFIELD: diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/impl/UndeclaredThrowableStrategy.java b/spring-core/src/main/java/org/springframework/cglib/transform/impl/UndeclaredThrowableStrategy.java index 81633786b61..02667752f5d 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/impl/UndeclaredThrowableStrategy.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/impl/UndeclaredThrowableStrategy.java @@ -16,10 +16,10 @@ package org.springframework.cglib.transform.impl; import org.springframework.cglib.core.ClassGenerator; +import org.springframework.cglib.core.ClassTransformer; import org.springframework.cglib.core.DefaultGeneratorStrategy; import org.springframework.cglib.core.GeneratorStrategy; import org.springframework.cglib.core.TypeUtils; -import org.springframework.cglib.core.ClassTransformer; import org.springframework.cglib.transform.MethodFilter; import org.springframework.cglib.transform.MethodFilterTransformer; import org.springframework.cglib.transform.TransformingClassGenerator; @@ -45,14 +45,11 @@ public class UndeclaredThrowableStrategy extends DefaultGeneratorStrategy { public UndeclaredThrowableStrategy(Class wrapper) { this.wrapper = wrapper; } - - private static final MethodFilter TRANSFORM_FILTER = new MethodFilter() { - public boolean accept(int access, String name, String desc, String signature, String[] exceptions) { - return !TypeUtils.isPrivate(access) && name.indexOf('$') < 0; - } - }; - protected ClassGenerator transform(ClassGenerator cg) throws Exception { + private static final MethodFilter TRANSFORM_FILTER = (access, name, desc, signature, exceptions) -> !TypeUtils.isPrivate(access) && name.indexOf('$') < 0; + + @Override + protected ClassGenerator transform(ClassGenerator cg) throws Exception { ClassTransformer tr = new UndeclaredThrowableTransformer(wrapper); tr = new MethodFilterTransformer(TRANSFORM_FILTER, tr); return new TransformingClassGenerator(cg, tr); diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/impl/UndeclaredThrowableTransformer.java b/spring-core/src/main/java/org/springframework/cglib/transform/impl/UndeclaredThrowableTransformer.java index 720f1d72ca8..708e1f1ce68 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/impl/UndeclaredThrowableTransformer.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/impl/UndeclaredThrowableTransformer.java @@ -36,15 +36,16 @@ public class UndeclaredThrowableTransformer extends ClassEmitterTransformer { this.wrapper = Type.getType(wrapper); boolean found = false; Constructor[] cstructs = wrapper.getConstructors(); - for (int i = 0; i < cstructs.length; i++) { - Class[] types = cstructs[i].getParameterTypes(); + for (Constructor cstruct : cstructs) { + Class[] types = cstruct.getParameterTypes(); if (types.length == 1 && types[0].equals(Throwable.class)) { found = true; break; } } - if (!found) - throw new IllegalArgumentException(wrapper + " does not have a single-arg constructor that takes a Throwable"); + if (!found) { + throw new IllegalArgumentException(wrapper + " does not have a single-arg constructor that takes a Throwable"); + } } @Override diff --git a/spring-core/src/main/java/org/springframework/cglib/util/ParallelSorter.java b/spring-core/src/main/java/org/springframework/cglib/util/ParallelSorter.java index 75051f7ca7d..cce5d6d8c47 100644 --- a/spring-core/src/main/java/org/springframework/cglib/util/ParallelSorter.java +++ b/spring-core/src/main/java/org/springframework/cglib/util/ParallelSorter.java @@ -290,9 +290,9 @@ abstract public class ParallelSorter extends SorterTemplate { if (arrays.length == 0) { throw new IllegalArgumentException("No arrays specified to sort"); } - for (int i = 0; i < arrays.length; i++) { - if (!arrays[i].getClass().isArray()) { - throw new IllegalArgumentException(arrays[i].getClass() + " is not an array"); + for (Object array : arrays) { + if (!array.getClass().isArray()) { + throw new IllegalArgumentException(array.getClass() + " is not an array"); } } new ParallelSorterEmitter(v, getClassName(), arrays); diff --git a/spring-core/src/main/java/org/springframework/cglib/util/SorterTemplate.java b/spring-core/src/main/java/org/springframework/cglib/util/SorterTemplate.java index 081760a9a08..42896a2db61 100644 --- a/spring-core/src/main/java/org/springframework/cglib/util/SorterTemplate.java +++ b/spring-core/src/main/java/org/springframework/cglib/util/SorterTemplate.java @@ -50,10 +50,10 @@ abstract class SorterTemplate { int v = j; for (;;) { while (compare(++i, v) < 0) { - /* nothing */; + /* nothing */ } while (compare(--j, v) > 0) { - /* nothing */; + /* nothing */ } if (j < i) { break;