博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java-(proxy)代理
阅读量:4977 次
发布时间:2019-06-12

本文共 2712 字,大约阅读时间需要 9 分钟。

1.静态代理

  

2.动态代理

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

java-静态代理

1.什么是代理:如打游戏,如果要操控人物需要通过通过鼠标键盘或其他硬件方可实现人物的操作。这个硬件就属于代理
2.如何实现代理:使用extends集成基类,或通过implements 集成接口方可实现代理(类似于Spring 的AOP)
2.使用代理的好处:在不改变原内容的情况下对现有业务增加新的功能。
3.使用代理的缺点:如果要集成接口的话需要实现新增的方法,如果是多个代理的话,那么每个都需要重写新的方法
4.代码示例
4.1设置接口
public interface SaveUser {
void insertUser();
}
4.2设置目标(原方法)
public class MySaveUser implements SaveUser {
@Override
public void insertUser() {
// TODO Auto-generated method stub
System.out.println("原方法执行");
}

}

4.3代理对象
public class ProxySaveUser implements SaveUser {
private SaveUser saveUser;
public ProxySaveUser(SaveUser saveUser){
this.saveUser = saveUser;
}
@Override
public void insertUser() {
// TODO Auto-generated method stub
System.out.println("执行代理了 ");
saveUser.insertUser();
}

}

4.4测试
public static void main(String[] args) {
// TODO Auto-generated method stub
SaveUser saveUser = new ProxySaveUser(new MySaveUser());
saveUser.insertUser();
}
Java-动态代理
1.如何实现动态代理:创建类实现InvocationHandler接口
2.代码示例
1.定义接口
/**
* 动态代理 定义接口
* @author johnzhang
*
*/
public interface School {

void getSchoolName();

void getUserName(String name);
}
2.实际对象
/**
* 原本 的类
* @author johnzhang
*
*/
public class Schoolimpl implements School {
@Override
public void getSchoolName() {
System.out.println("MySchool Name IS Cheng Long");
}
@Override
public void getUserName(String name) {
// TODO Auto-generated method stub
System.out.println("您传入的姓名是" + name);
}
}
3.创建代理方法
public class ProxySchoolImpl implements InvocationHandler {
private School school;
public ProxySchoolImpl(School school){
this.school = school;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("执行代理方法啦啦啦啦啦啦!!!方法名" + method.getName() + "参数集合" );
method.invoke(school, args);
System.out.println("执行代理方法完成啦啦啦啦啦啦!!!方法名" + method.getName() + "参数集合");
return null;
}
}
4.测试方法:
public static void main(String[] args) {
// 我们要代理的真实对象
School schoolimpl = new Schoolimpl();
// 我们要代理哪个真实对象,就将该对象传进去,最后是通过该真实对象来调用其方法的
schoolimpl.getSchoolName();
/*
* 通过Proxy的newProxyInstance方法来创建我们的代理对象,我们来看看其三个参数
* 第一个参数 handler.getClass().getClassLoader() ,我们这里使用handler这个类的ClassLoader对象来加载我们的代理对象
* 第二个参数realSubject.getClass().getInterfaces(),我们这里为代理对象提供的接口是真实对象所实行的接口,表示我要代理的是该真实对象,这样我就能调用这组接口中的方法了
* 第三个参数handler, 我们这里将这个代理对象关联到了上方的 InvocationHandler 这个对象上
*/
InvocationHandler invocationHandler = new ProxySchoolImpl(schoolimpl);
schoolimpl = (School) Proxy.newProxyInstance(invocationHandler.getClass().getClassLoader(),schoolimpl.getClass().getInterfaces(),invocationHandler);
schoolimpl.getSchoolName();
System.out.println("===========================================");
schoolimpl.getUserName("Li Ming");
}

转载于:https://www.cnblogs.com/lvwqq/p/9056493.html

你可能感兴趣的文章
VS中展开和折叠代码
查看>>
如何确定VS编译器版本
查看>>
设置PL/SQL 快捷键
查看>>
个人阅读作业7
查看>>
转载:深入浅出Zookeeper
查看>>
GMA Round 1 新程序
查看>>
node anyproxy ssi简易支持
查看>>
编译预处理指令:文件包含指令、宏定义指令、条件编译指令
查看>>
PHP函数 ------ ctype_alnum
查看>>
网站安全
查看>>
WS-Addressing 初探
查看>>
.NET+模块编排+数据库操作类的封装+分层架构+实体类+Ajax.net+Athem.NET+javascript+Activex组件+用户权限等...
查看>>
Markdown不常见功能
查看>>
(二)NUnit单元测试心得
查看>>
hdu_2604Queuing(快速幂矩阵)
查看>>
frame.bounds和center
查看>>
HDU 1102 Constructing Roads
查看>>
android StaticLayout参数解释
查看>>
多线程之ThreadLocal类
查看>>
Qt-读取文本导出word
查看>>