nvocationHandler 完成。
清单 17. ProxyEx 的静态方法 getInvocationHandler
public static InvocationHandler getInvocationHandler (Object proxy)
throws IllegalArgumentException
{
// 如果Proxy实例,直接调父类的方法
if( proxy instanceof Proxy )
{
return Proxy.getInvocationHandler( proxy );
}
// 如果不是代理类,抛异常
if( !Proxy.isProxyClass( proxy.getClass() ))
{
throw new IllegalArgumentException("Not a proxy instance");
}
try
{
// 通过反射获取扩展代理类的调用处理器对象
Field invoker = proxy.getClass().getDeclaredField ("handler");
invoker.setAccessible(true);
return (InvocationHandler)invoker.get(proxy);
}
catch(Exception e)
{
throw new IllegalArgumentException("Suspect not a proxy instance");
}
}
坦言:也有局限
受限于 Java 的类继承机制,扩展的动态代理机制也有其局限,它不能支持 :
声明为 final 的类;
声明为 final 的函数;
构造函数均为 private 类型的类;
Java动态代理机制分析及扩展,第2部分(11)
时间:2011-06-21 IBM / 王忠平 何平
实例演示
阐述了这么多,相信读者一定很想看一下扩展动态代理机制是如何工作的。 本文最后将以 2010 世博门票售票代理为模型进行演示。
首先,我们定义了一个售票员抽象类 TicketSeller。
清单 18. TicketSeller
public abstract class TicketSeller
{
protected String theme;
protected TicketSeller(String theme)
{
this.theme = theme;
}
public String getTicketTheme()
{
return this.theme;
}
public void setTicketTheme(String theme)
{
this.theme = theme;
}
public abstract int getTicketPrice();
public abstract int buy(int ticketNumber, int money) throws Exception;
}
其次,我们会实现一个 2010 世博门票售票代理类 Expo2010TicketSeller。
清单 19. Expo2010TicketSeller
public class Expo2010TicketSeller extends TicketSeller
{
protected int price;
protected int numTicketForSale;
public Expo2010TicketSeller()
{
super("World Expo 2010");
this.price = 180;
this.numTicketForSale = 200;
}
public int getTicketPrice()
{
return price;
}
public int buy(int ticketNumber, int money) throws Exception
{
if( ticketNumber > numTicketForSale )
{
throw new Exception("There is no enough ticket available for sale, only "
+ numTicketForSale + " ticket(s) left");
}
int charge = money - ticketNumber * price;
if( charge < 0 )
{
throw new Exception("Money is not enough. Still needs "
+ (-charge) + " RMB.");
}
numTicketForSale -= ticketNumber;
return charge;
}
}
Java动态代理机制分析及扩展,第2部分(12)
时间:201 |