java反射回顾<四>
来源:互联网 发布:全能行证券交易软件 编辑:程序博客网 时间:2024/06/04 23:27
jdk动态代理
//动物接口public interface Animal { void shout(String sound);}
//动物接口实现类public class Cat implements Animal { @Override public void shout(String sound) { for (int i = 0; i < 3; i++) { System.out.print("cat->"+sound + "! "); } System.out.println(); }}
//动物接口实现类public class Dog implements Animal { @Override public void shout(String sound) { for (int i = 0; i < 3; i++) { System.out.print("dog->"+sound + "! "); } System.out.println(); }}
class AnimalProxy implements InvocationHandler { private Object target; public Object getInstance(Object target) { this.target = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; System.out.println("方法调用前..."); result = method.invoke(target, args); System.out.println("方法调用后..."); return result; }}
public class ProxyTest { public static void main(String[] args) { AnimalProxy proxy=new AnimalProxy(); Animal dogProxy= (Animal) proxy.getInstance(new Dog()); dogProxy.shout("wang"); }}
cglib动态代理
JDK动态代理机制缺陷:JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理
cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,
cglib缺陷 cglib实现动态代理但因为采用的是继承,所以不能对final修饰的类进行代理。
class Snake { public void makeSound(String name) { System.out.println("Hi," + name + ""); }}class AnimalProxyCglib implements MethodInterceptor { private Object target; public Object getInstance(Object target) { this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { Object result = null; System.out.println("方法调用前操作..."); result = methodProxy.invokeSuper(o, objects); System.out.println("方法调用后操作..."); return result; }}public class DynamicProxyCglibDemo { public static void main(String[] args) { AnimalProxyCglib proxy = new AnimalProxyCglib(); Snake dogProxy=(Snake)proxy.getInstance(new Snake()); dogProxy.makeSound("tom"); }}
RPC利用动态代理调用远程函数
HelloService helloService=rpcProxy.create(HelloService.class);
客户端需要调用远程一个服务对象的时候,通过动态代理的方式创建客户端所需的对象
public <T> T create(final Class<?> interfaceClass, final String serviceVersion) { return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class<?>[]{interfaceClass}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //创建RPC请求对象,并设置请求属性 RpcRequest request = new RpcRequest(); request.setRequestId(UUID.randomUUID().toString()); request.setInterfaceName(method.getDeclaringClass().getName()); request.setMethodName(method.getName()); request.setParameterTypes(method.getParameterTypes()); request.setServiceVersion(serviceVersion); request.setParameter(args); //获取Rpc服务地址 if (serviceDiscovery != null) { String serviceName = interfaceClass.getName(); if (StringUtil.isNotEmpty(serviceVersion)) { serviceName += "-"+serviceVersion; } serviceAddress = serviceDiscovery.discover(serviceName); LOGGER.debug("discover service:{}=>", serviceName, serviceVersion); } if (StringUtil.isEmpty(serviceAddress)) { throw new RuntimeException("service address is empty "); } //从rpc服务地址中解析主机名与对应的端口号 String[] array = StringUtil.split(serviceAddress, ":"); String host = array[0]; int port = Integer.parseInt(array[1]); //创建rpc客户端对象并且发送rpc请求 RpcClient client = new RpcClient(host, port); long beginTime = System.currentTimeMillis(); RpcResponse response = client.send(request); LOGGER.debug("time:{}ms", System.currentTimeMillis() - beginTime); if (response == null) { throw new RuntimeException("response is null "); } if (response.hasException()) { throw response.getException(); } else { return response.getResult(); } } }); }
阅读全文
0 0
- java反射回顾<四>
- java 反射回顾
- Java回顾之反射
- java反射回顾<一>
- java反射回顾<二>
- java反射回顾<三>
- Java基础回顾(四)
- JAVA回顾(四)
- java之反射(回顾)
- java零基础知识回顾(反射)
- java反射知识点简单回顾
- Java基础知识回顾--反射机制
- java基础知识回顾(四)
- java反射学习四
- java反射笔记四
- 19Java语法回顾之反射
- Java基础回顾 : 反射机制相关知识
- Java反射机制总结四
- 使用pypy提升python程序性能, 附下载地址
- 第三章 Shell表达式与运算符
- 定时器2个小时
- 实现二叉树的各种基本运算方法
- android之android-autofittextview
- java反射回顾<四>
- PHP windows配置
- MYSQL中“unsigned attribute”在自增主键中的应用
- Mysql语句执行效率检查和通过索引优化_实例
- 【Scikit-Learn 中文文档】决策树
- SVN--搭建多工程svn服务器
- 【Scikit-Learn 中文文档】集成方法
- 关于android中应用内存优化实践
- 第四章 Shell流程控制