DUBBO-4 final的判断改为白名单方式 否则可能会增加序列化的成本.

git-svn-id: http://code.alibabatech.com/svn/dubbo/trunk@94 1a56cb94-b969-4eaa-88fa-be21384802f2
This commit is contained in:
chao.liuc 2011-10-28 03:45:08 +00:00
parent e1e250e664
commit d700d0e3cf
1 changed files with 25 additions and 3 deletions

View File

@ -23,6 +23,7 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@ -383,7 +384,7 @@ public abstract class Builder<T> implements GenericDataFlags
{
f = c.getDeclaredField(fn);
int mod = f.getModifiers();
if( Modifier.isStatic(mod) || Modifier.isFinal(mod) )
if( Modifier.isStatic(mod) || (!ignoreFinalModifier(c) && Modifier.isFinal(mod)) )
throw new RuntimeException("Field [" + c.getName() + "." + fn + "] is static/final field.");
if( Modifier.isTransient(mod) )
{
@ -414,7 +415,9 @@ public abstract class Builder<T> implements GenericDataFlags
for( Field tf : fs )
{
int mod = tf.getModifiers();
if( Modifier.isStatic(mod) || tf.getName().equals("this$0") ) // skip static or inner-class's 'this$0' field.
if (Modifier.isStatic(mod)
|| (!ignoreFinalModifier(c) && Modifier.isFinal(mod))
|| tf.getName().equals("this$0") ) // skip static or inner-class's 'this$0' field.
continue;
if( Modifier.isTransient(mod) )
{
@ -856,7 +859,26 @@ public abstract class Builder<T> implements GenericDataFlags
private static String propertyName(String s)
{
return s.length() == 1 || Character.isLowerCase(s.charAt(1)) ? Character.toLowerCase(s.charAt(0)) + s.substring(1) : s;
}
}
private static boolean ignoreFinalModifier(Class cl)
{
if (cl.isAssignableFrom(BigInteger.class)) return true;
return false;
}
@SuppressWarnings("unused")
private static boolean isPrimitiveOrPrimitiveArray1(Class<?> cl)
{
if (cl.isPrimitive()){
return true;
} else {
Class clazz = cl.getClass().getComponentType();
if (clazz!=null && clazz.isPrimitive()){
return true;
}
}
return false;
}
private static String defaultArg(Class<?> cl)
{