ReflectiveDynamicClientCreator.java 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package cn.nosum.support.proxy;
  2. import cn.nosum.support.config.DynamicMethodsEndpointRegistrar;
  3. import cn.nosum.support.endpoint.MethodEndpoint;
  4. import cn.nosum.support.core.utils.CheckUtil;
  5. import org.springframework.util.ReflectionUtils;
  6. import java.lang.reflect.InvocationHandler;
  7. import java.lang.reflect.Method;
  8. import java.lang.reflect.Proxy;
  9. import java.util.Map;
  10. /**
  11. * Reflective dynamic method client instance creator。
  12. *
  13. * @author Young
  14. */
  15. public class ReflectiveDynamicClientCreator extends DynamicClientCreator {
  16. private final InvocationHandlerFactory factory;
  17. public ReflectiveDynamicClientCreator(InvocationHandlerFactory factory) {
  18. this.factory = factory;
  19. }
  20. @Override
  21. public <T> T newInstance(Target<T> target) {
  22. InvocationHandler handler = factory.create(target);
  23. return (T) Proxy.newProxyInstance(target.type().getClassLoader(), new Class<?>[] {target.type()}, handler);
  24. }
  25. static class DynamicMethodsInvocationHandler implements InvocationHandler {
  26. private final Target target;
  27. private Map<String, MethodEndpoint> nameToEndpoint;
  28. DynamicMethodsInvocationHandler(Target target) {
  29. this.target = target;
  30. }
  31. @Override
  32. public Object invoke(Object proxy, Method method, Object[] args) {
  33. if (null == nameToEndpoint){
  34. nameToEndpoint = DynamicMethodsEndpointRegistrar.getEndpoint(target.refName());
  35. }
  36. if ("equals".equals(method.getName())) {
  37. try {
  38. Object otherHandler = args.length > 0 && args[0] != null ? Proxy.getInvocationHandler(args[0]) : null;
  39. return equals(otherHandler);
  40. } catch (IllegalArgumentException e) {
  41. return false;
  42. }
  43. } else if ("hashCode".equals(method.getName())) {
  44. return hashCode();
  45. } else if ("toString".equals(method.getName())) {
  46. return toString();
  47. }
  48. if (null != args){
  49. String arg0 = String.valueOf(args[0]);
  50. MethodEndpoint methodEndpoint = CheckUtil.checkNotNull(nameToEndpoint.get(arg0),"method is not found!!!");
  51. Object[] newArgs = new Object[args.length-1];
  52. System.arraycopy(args, 1, newArgs, 0, args.length - 1);
  53. if (methodEndpoint.isMatcher(newArgs)){
  54. return ReflectionUtils.invokeMethod(method,methodEndpoint.getBean(),newArgs);
  55. }
  56. }
  57. return null;
  58. }
  59. @Override
  60. public boolean equals(Object obj) {
  61. if (obj instanceof DynamicMethodsInvocationHandler) {
  62. DynamicMethodsInvocationHandler other = (DynamicMethodsInvocationHandler) obj;
  63. return target.equals(other.target);
  64. }
  65. return false;
  66. }
  67. @Override
  68. public int hashCode() {
  69. return target.hashCode();
  70. }
  71. @Override
  72. public String toString() {
  73. return target.toString();
  74. }
  75. }
  76. }