黑马程序员——java代理(含加载器)概述
2013-11-11 16:45
423 查看
----------------------------android培训
java培训 期待与您交流!
-----------------
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。按照代理的创建时期,代理类可以分为两种。静态代理是由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理是在程序运行时,运用反射机制动态创建而成。而实际开发中要经常用到动态代理。
JDK动态代理中包含一个类和一个接口: InvocationHandler接口和Proxy类。
InvocationHandler接口:
Proxy类:
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法:
参数说明: ClassLoader loader:类加载器 。Class<?>[] interfaces:得到全部的接口 。InvocationHandler h:得到InvocationHandler接口的子类实例。
类加载器 在Proxy类中的newProxyInstance()方法中需要一个ClassLoader类的实例,ClassLoader实际上对应的是类加载器,在Java中主要有一下三种类加载器,Booststrap ClassLoader:此加载器采用C++编写,一般开发中是看不到的; Extendsion ClassLoader:用来进行扩展类的加载,一般对应的是jre\lib\ext目录中的类; AppClassLoader:(默认)加载classpath指定的类,是最常使用的是一种加载器。
类加载器加载原理:
如果SystemClassloader加载不到,才会给自己的加载器加载。
动态代理示例:
接口:
代理实现类
java培训 期待与您交流!
-----------------
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。按照代理的创建时期,代理类可以分为两种。静态代理是由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理是在程序运行时,运用反射机制动态创建而成。而实际开发中要经常用到动态代理。
JDK动态代理中包含一个类和一个接口: InvocationHandler接口和Proxy类。
InvocationHandler接口:
public interface InvocationHandler { public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{ } }参数说明: Object proxy:指被代理的对象。 Method method:要调用的方法 Object[] 。args:方法调用时所需要的参数 。
Proxy类:
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException { }
参数说明: ClassLoader loader:类加载器 。Class<?>[] interfaces:得到全部的接口 。InvocationHandler h:得到InvocationHandler接口的子类实例。
类加载器 在Proxy类中的newProxyInstance()方法中需要一个ClassLoader类的实例,ClassLoader实际上对应的是类加载器,在Java中主要有一下三种类加载器,Booststrap ClassLoader:此加载器采用C++编写,一般开发中是看不到的; Extendsion ClassLoader:用来进行扩展类的加载,一般对应的是jre\lib\ext目录中的类; AppClassLoader:(默认)加载classpath指定的类,是最常使用的是一种加载器。
类加载器加载原理:
如果SystemClassloader加载不到,才会给自己的加载器加载。
动态代理示例:
接口:
import java.lang.reflect.Method; public interface Advice { void beforeMethod(Method method); void afterMethod(Method method); }代理类
public class MyAdvice implements Advice { long beginTime = 0; public void afterMethod(Method method) { // TODO Auto-generated method stub System.out.println("从黑马毕业上班啦!"); long endTime = System.currentTimeMillis(); System.out.println(method.getName() + " running time of " + (endTime - beginTime)); } public void beforeMethod(Method method) { // TODO Auto-generated method stub System.out.println("到黑马来学习啦!"); beginTime = System.currentTimeMillis(); } }
代理实现类
import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Collection; public class ProxyTest { public static void main(String[] args) throws Exception{ final ArrayList target = new ArrayList(); Collection proxy= (Collection)getProxy(target,new MyAdvice()); proxy.add("zxx"); //调用handler.invoke()方法 proxy.add("lhm"); proxy.add("bxd"); System.out.println(proxy.size()); System.out.println(proxy.getClass().getName()); } private static Object getProxy(final Object target,final Advice advice) { Object proxy= Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler(){ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { advice.beforeMethod(method); Object retVal = method.invoke(target, args); advice.afterMethod(method); return retVal; } } ); return proxy; } }
相关文章推荐
- 黑马程序员 java_高新技术(五)_类加载器和代理
- 黑马程序员-Java高新技术之类加载器和代理
- 黑马程序员-----java提高之类加载器&代理
- 黑马程序员—JAVA高新技术之类加载器、动态代理
- 黑马程序员_java高新技术—类加载器&&动态代理
- 黑马程序员_java高新技术—类加载器&&动态代理
- 黑马程序员_java基础笔记(13)...类加载器和代理
- 黑马程序员_java基础笔记(13)...类加载器和代理
- 黑马程序员_Java高新技术——类加载器和动态代理(第9篇)
- 黑马程序员__JAVA基础加强--类加载器和代理总结
- 黑马程序员之 ---- Java语言的概述(初步了解java)
- 黑马程序员—java技术blog—第十四篇线程基础概述
- 黑马程序员——Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律
- 黑马程序员_Java动态代理
- Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律 (黑马程序员)
- 黑马程序员--java高新技术--动态代理
- 黑马程序员_Java基础加强(下)_类加载器,代理_28
- 黑马程序员 Java代理类
- 黑马程序员_Java概述笔记
- 黑马程序员之Java基础加强之类加载器