55import java .lang .reflect .Modifier ;
66import java .lang .reflect .Type ;
77import java .util .ArrayList ;
8+ import java .util .Arrays ;
89import java .util .List ;
910
1011public class ExtensionManager {
@@ -16,40 +17,79 @@ public static void registerExtension(Extension extension) {
1617 }
1718
1819 public static CustomizedConstructor getCtor (Class clazz ) {
20+ return getCtor (clazz , false );
21+ }
22+
23+ public static CustomizedConstructor getCtor (Class clazz , boolean includingPrivate ) {
1924 for (Extension extension : extensions ) {
2025 CustomizedConstructor ctor = extension .getConstructor (clazz );
2126 if (ctor != null ) {
27+ if (ctor .ctor != null && includingPrivate ) {
28+ ctor .ctor .setAccessible (true );
29+ }
2230 for (Binding param : ctor .parameters ) {
2331 if (param .fromNames == null ) {
2432 param .fromNames = new String []{param .name };
2533 }
2634 param .clazz = clazz ;
35+ param .valueTypeLiteral = createTypeLiteral (param .valueType );
2736 updateFromNames (param );
2837 }
2938 return ctor ;
3039 }
3140 }
32- return CustomizedConstructor .DEFAULT_INSTANCE ;
41+ CustomizedConstructor cctor = new CustomizedConstructor ();
42+ try {
43+ cctor .ctor = clazz .getDeclaredConstructor ();
44+ if (includingPrivate ) {
45+ cctor .ctor .setAccessible (true );
46+ }
47+ } catch (Exception e ) {
48+ throw new RuntimeException (e );
49+ }
50+ return cctor ;
3351 }
3452
3553 public static List <Binding > getFields (Class clazz ) {
54+ return getFields (clazz , false );
55+ }
56+
57+ public static List <Binding > getFields (Class clazz , boolean includingPrivate ) {
3658 ArrayList <Binding > bindings = new ArrayList <Binding >();
37- for (Field field : clazz .getFields ()) {
59+ List <Field > allFields = Arrays .asList (clazz .getFields ());
60+ if (includingPrivate ) {
61+ allFields = new ArrayList <Field >();
62+ Class current = clazz ;
63+ while (current != null ) {
64+ allFields .addAll (Arrays .asList (current .getDeclaredFields ()));
65+ current = current .getSuperclass ();
66+ }
67+ }
68+ for (Field field : allFields ) {
3869 if (Modifier .isStatic (field .getModifiers ())) {
3970 continue ;
4071 }
72+ if (includingPrivate ) {
73+ field .setAccessible (true );
74+ }
4175 Binding binding = new Binding ();
4276 binding .fromNames = new String []{field .getName ()};
4377 binding .name = field .getName ();
4478 binding .valueType = field .getType ();
79+ binding .valueTypeLiteral = createTypeLiteral (binding .valueType );
4580 binding .clazz = clazz ;
4681 binding .annotations = field .getAnnotations ();
82+ binding .field = field ;
4783 updateFromNames (binding );
4884 bindings .add (binding );
4985 }
5086 return bindings ;
5187 }
5288
89+ private static TypeLiteral createTypeLiteral (Type valueType ) {
90+ return new TypeLiteral (valueType , TypeLiteral .generateDecoderCacheKey (valueType ));
91+ }
92+
5393 private static void updateFromNames (Binding binding ) {
5494 for (Extension extension : extensions ) {
5595 if (extension .updateBinding (binding )) {
@@ -59,6 +99,10 @@ private static void updateFromNames(Binding binding) {
5999 }
60100
61101 public static List <CustomizedSetter > getSetters (Class clazz ) {
102+ return getSetters (clazz , false );
103+ }
104+
105+ public static List <CustomizedSetter > getSetters (Class clazz , boolean includingPrivate ) {
62106 ArrayList <CustomizedSetter > setters = new ArrayList <CustomizedSetter >();
63107 for (Method method : clazz .getMethods ()) {
64108 if (Modifier .isStatic (method .getModifiers ())) {
@@ -109,6 +153,10 @@ public static List<CustomizedSetter> getSetters(Class clazz) {
109153 }
110154
111155 public static List <Binding > getGetters (Class clazz ) {
156+ return getGetters (clazz , false );
157+ }
158+
159+ public static List <Binding > getGetters (Class clazz , boolean includingPrivate ) {
112160 ArrayList <Binding > getters = new ArrayList <Binding >();
113161 for (Method method : clazz .getMethods ()) {
114162 if (Modifier .isStatic (method .getModifiers ())) {
@@ -140,4 +188,20 @@ public static List<Binding> getGetters(Class clazz) {
140188 }
141189 return getters ;
142190 }
191+
192+ public static void registerTypeDecoder (Class clazz , Decoder decoder ) {
193+ Codegen .addNewDecoder (TypeLiteral .generateDecoderCacheKey (clazz ), decoder );
194+ }
195+
196+ public static void registerTypeDecoder (TypeLiteral typeLiteral , Decoder decoder ) {
197+ Codegen .addNewDecoder (typeLiteral .cacheKey , decoder );
198+ }
199+
200+ public static void registerFieldDecoder (Class clazz , String field , Decoder decoder ) {
201+ Codegen .addNewDecoder (field + "@" + TypeLiteral .generateDecoderCacheKey (clazz ), decoder );
202+ }
203+
204+ public static void registerFieldDecoder (TypeLiteral typeLiteral , String field , Decoder decoder ) {
205+ Codegen .addNewDecoder (field + "@" + typeLiteral .cacheKey , decoder );
206+ }
143207}
0 commit comments