关于动态代理模式
来源:互联网 发布:腾讯代理绝地求生知乎 编辑:程序博客网 时间:2024/06/03 13:38
1.动态代理嵌套, 其含义就是将代理对象变为被代理对象
//代理接口声明
public interface Sanc {
public void print();
}
//被代理对象 Sanc1
public class Sanc1 implements Sanc{
public void print(){
System.out.println("sanc1");
}
}
//代理对象DySanc2 ,代理Sanc1
public class DySanc2 implements InvocationHandler{
private Object sub;
public DySanc2(){
}
public DySanc2(Object obj){
sub = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
tell();
System.out.println(method);
method.invoke(sub, args);
System.out.println("after calling " + method);
return null;
}
public void tell(){
System.out.println("动态代理:我是lao2");
}
}
//代理对象DySanc3 ,代理DySanc2
public class DySanc3 implements InvocationHandler{
private Object sub;
public DySanc3(){
}
public DySanc3(Object obj){
sub = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
tell();
System.out.println(method);
method.invoke(sub, args);
System.out.println("after calling " + method);
return null;
}
public void tell(){
System.out.println("动态代理嵌套:我是老3");
}
}
//测试用例
public class Test {
public static void main(String[] args) throws Throwable{
Sanc sc1 = new Sanc1();
InvocationHandler sc2 = new DySanc2(sc1);
InvocationHandler sc3 = new DySanc3(sc2);
Class<?> cls2 = sc2.getClass();
//此处重点 ,将代理对象DySanc2,声明为DySanc3的被代理对象。
InvocationHandler dysc2 = (InvocationHandler) Proxy.newProxyInstance(
cls2.getClassLoader(), cls2.getInterfaces(), sc3);
Class<?> cls = sc1.getClass();
//将上一处生成的DySanc2代理对象,作为Sanc1的代理类。
Sanc dysc1 = (Sanc) Proxy.newProxyInstance(
cls.getClassLoader(), cls.getInterfaces(), dysc2);
// 嵌套第二层代理,只是代理InvocationHandler 这部分,不然无法回调sanc1的方法.
//发觉还是直接运行一下比较好理解。说了一堆废话
dysc1.print();
}
}
2.传统代理,直接上列子
public class Client {
public static void main(String[] args) throws Throwable{
//创建真实类的一个对象
RealSubject rs = new RealSubject();
//得到代理器实例
InvocationHandler ds = new DynamicSubject(rs);
Class<?> cls = rs.getClass();
//cls.getClassLoader():定义代理类的类加载器
//cls.getInterfaces()代理类要实现的接口列表,但代理实例化好以后,就宣称他实现了这些接口
//ds:代理处理器,此时invoke方法还没执行
//返回一个有代理有代理处理器代理实例,就是所创造的去要原子弹的代理人
Subject subject = (Subject) Proxy.newProxyInstance(
cls.getClassLoader(), cls.getInterfaces(), ds);
System.out.println(subject.getClass());
/ subject.response("june");
}
}
DynamicSubject ;java
public class DynamicSubject implements InvocationHandler{
private Object sub;
public DynamicSubject(){
}
public DynamicSubject(Object obj){
sub = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before calling " + method);
//注意!!!调用sub对象的method方法,传的参数是args
System.out.println(method);
method.invoke(sub, args);
System.out.println("after calling " + method);
return null;
}
public Object getSub() {
return sub;
}
public void setSub(Object sub) {
this.sub = sub;
}
}
public class RealSubject implements Subject{
@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("From real subject.request");
}
@Override
public void response(String str) {
// TODO Auto-generated method stub
System.out.println("From real subject.response"+str);
}
}
public interface Subject {
public void request();
public void response(String str);
}
3.第二种 使用一个空接口,真实代理却是其他对象
public interface Mapper {
public void execute();
}
public class DynamicMapper implements InvocationHandler{
private Object obj;
public DynamicMapper(Object obj){
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
String content = (String) ((HashMap) obj).get("execute");
System.out.println(content);
System.out.println(method);
return null;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
}
public class DemoTest {
public static void main(String[] args) {
Map map = new HashMap();
map.put("execute", " execute some content");
DynamicMapper ds = new DynamicMapper(map);
Mapper mapper = (Mapper) Proxy.newProxyInstance(
Mapper.class.getClassLoader(),new Class[]{Mapper.class}, ds);
mapper.execute();
}
}
- 关于动态代理模式
- 关于java动态代理模式
- 代理模式--动态代理
- 代理模式 & 动态代理
- 代理模式--动态代理
- 代理模式(动态代理)
- 代理模式-动态代理
- 代理模式-动态代理
- 代理模式动态代理
- 代理模式-动态代理
- 代理模式 -动态代理
- 代理模式---动态代理
- 代理模式-动态代理
- 代理模式之动态代理
- java代理模式--动态代理
- 代理模式之动态代理
- 代理模式之动态代理
- 代理模式之动态代理
- Android EditText/TextView使用SpannableString显示复合文本
- FJUTOJ 校赛J 第十集 原来这一切都是真的 (树形概率dp)
- C++快速排序(随机值元法)
- Log4j的输出日志级别
- maven项目在eclipse中运行clean test 等报错
- 关于动态代理模式
- Linux 上tomcat的安装
- objc block的介绍和使用
- 再造 “手机QQ” 侧滑菜单(一)——实现侧滑效果
- 网络流
- ASIHTTPRequest杂记
- java ftp 上传下载(写入自定义字符串)
- 触发器例子
- mysql数据类型