java代理 jdk动态代理应用案列
程序员文章站
2023-12-01 19:57:16
java代理有jdk动态代理、cglib代理,这里只说下jdk动态代理,jdk动态代理主要使用的是java反射机制(既java.lang.reflect包) 原理是(歌手、...
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();
}
}
原理是(歌手、经纪人做例子):
建立一个公共的接口,比如:歌手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();
}
}