您的位置:首页 > 职场人生

黑马程序员——java代理(含加载器)概述

2013-11-11 16:45 423 查看
 ----------------------------android培训 
  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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息