ClassWrapper.java 2.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package com.zipcodewilmington.generic;
  2. /**
  3. * @author leon on 06/12/2018.
  4. */
  5. import com.github.git_leon.collectionutils.maps.IntrospectiveMap;
  6. import sun.reflect.generics.reflectiveObjects.TypeVariableImpl;
  7. import sun.reflect.generics.tree.FieldTypeSignature;
  8. import sun.reflect.generics.tree.SimpleClassTypeSignature;
  9. import java.lang.reflect.Field;
  10. import java.lang.reflect.ParameterizedType;
  11. import java.lang.reflect.Type;
  12. import java.util.List;
  13. import java.util.Map;
  14. /**
  15. * @author leon on 05/12/2018.
  16. * This class exists for testing purposes
  17. */
  18. public class ClassWrapper {
  19. private final TypeVariableImpl type;
  20. private final Object object;
  21. public ClassWrapper(Object o, int parameterizedIndex) {
  22. Class<?> cls = o.getClass();
  23. Type superType = cls.getGenericSuperclass();
  24. ParameterizedType parameterizedClassType = (ParameterizedType)superType;
  25. Type[] parameterizedTypes = parameterizedClassType.getActualTypeArguments();
  26. Type typeOfClassParameterization = parameterizedTypes[parameterizedIndex];
  27. this.object = o;
  28. this.type = (TypeVariableImpl) typeOfClassParameterization;
  29. }
  30. private Field getBoundASTsAsField() {
  31. Field f = null;
  32. try {
  33. f = type.getClass().getDeclaredField("boundASTs");
  34. f.setAccessible(true);
  35. } catch (Throwable e) {
  36. throw new Error(e);
  37. }
  38. return f;
  39. }
  40. public String getParameterizedType(){
  41. Field boundASTs = getBoundASTsAsField();
  42. FieldTypeSignature[] f;
  43. try {
  44. f = (FieldTypeSignature[]) boundASTs.get(type);
  45. return getUpperBoundOfType(f);
  46. } catch (IllegalAccessException e) {
  47. throw new Error(e);
  48. }
  49. }
  50. private String getUpperBoundOfType(FieldTypeSignature[] fieldTypeSignatures) {
  51. try {
  52. FieldTypeSignature fieldTypeSignature = fieldTypeSignatures[0];
  53. Class<? extends FieldTypeSignature> clss = fieldTypeSignature.getClass();
  54. Field field = clss.getDeclaredField("path");
  55. field.setAccessible(true);
  56. List<? extends SimpleClassTypeSignature> list = (List<? extends SimpleClassTypeSignature>) field.get(fieldTypeSignature);
  57. Map m = new IntrospectiveMap(list.get(0));
  58. return m.get("name").toString();
  59. } catch (Throwable e) {
  60. throw new Error(e);
  61. }
  62. }
  63. }