您的位置:首页 > 其它

动态代理模式的相关细节描述

2014-04-23 10:15 253 查看
public interface House//动态代理模式必须使用接口,需要注意
{
public void findHouse();
}

public class EmployeeWish implements House
{
public void findHouse()//真实对象实现接口中方法
{
System.out.println("Where to find the house?");
}
}

import java.lang.reflect.*;
public class Helper implements InvocationHandler//代理角色必须实现InvocationHandler接口中的invoke方法
{
private Object obj;//接收类型为object类型,多态的使用,使得动态代理模式可以进行多种类型的代理,没有局限性
public Helper(Object obj)
{
this.obj=obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)//接收参数自动从代理实例所调用的方法中加载,有底层去实现,无需过分操心!
throws Throwable
{
Object object=method.invoke(obj, args);//通过接收的方法,使用反射调用真实对象中的方法
return obj;
}
}

import java.lang.reflect.*;
public class Test
{
public static void main(String args[])
{
EmployeeWish employee=new EmployeeWish();
Class<?> classType=employee.getClass();
Helper help=new Helper(employee);//注意使用Proxy的静态方法生成代理实例时的接收参数
House house=(House)Proxy.newProxyInstance(classType.getClassLoader(),classType.getInterfaces(), help);
//由于静态方法接收参数种知道了对象所实现的接口,因而该代理实例也实现了这些接口,使用多态可将其类型转换为接口类型!
house.findHouse();//通过代理实例调用方法时,会自动转移到代理对象中的invoke方法
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: