ReflectiveDynamicClientCreator.java 3.0 KB

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