【 tulaoshi.com - 编程语言 】
                             
                            java代理有jdk动态代理、cglib代理,这里只说下jdk动态代理,jdk动态代理主要使用的是java反射机制(既java.lang.reflect包) 
原理是(歌手、经纪人做例子): 
建立一个公共的接口,比如:歌手public interface Singer; 
用具体的类实现接口,比如:周杰伦,他是歌手所以实现Singer这个类,class MySinger implements Singer 
建立代理类,这里也就是经纪人,他需要实现InvocationHandler类,并重写invoke方法 
这样当有什么事情,要找周杰伦(具体类)的时候,就必须先到经纪人(代理类)那里处理,代理人在决定要不要与你见面(该方法要不要执行) 
1、歌手接口 
代码如下: 
public interface Singer { 
public abstract void sing(); 
public abstract String s(); 
}  
2、具体的歌手 
代码如下: 
public class MySinger implements Singer { 
public void sing() { 
// TODO Auto-generated method stub 
System.err.println("唱歌。。。。"); 
} 
}  
3、代理类(经纪人) 
代码如下: 
public class agent implements InvocationHandler{ 
public Object target; 
//绑定 
public Object bind(Object target){ 
this.target=target; 
//必须放回Proxy 
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); 
} 
//重新 
public Object invoke(Object proxy, Method method, Object[] args) 
throws Throwable { 
Object o =null; 
System.out.println("开始事务"); 
System.out.println("判断权限"); 
o = method.invoke(target, args);//执行方法 
System.out.println("结束事务"); 
return o; 
} 
}  
4、测试(为什么要间接口能,下面你会发现代理返回的是他们的接口类,这要一个代理类,就可以代理多个类,只要该类是同个一个接口的是实现) 
代码如下: 
public class Test { 
public static void main(String[] args) { 
// 
agent a =new agent(); 
Singer s= (Singer) a.bind(new MySinger()); 
s.sing(); 
} 
}