黑马程序员:Java基础总结----静态代理模式&动态代理
class
Ts {
public
static
void
main(String[] args)
throws
Exception {
// 通过中介公司生产一批衣服
new
ProxCompany(
new
LiNingCompany());
ClothingProduct {
void
productClothing();
// 有生产一批衣服的功能
ProxCompany
implements
ClothingProduct {
private
ClothingProduct
cp
;
// 中介公司不会生产衣服,需要找一家真正能生产衣服的公司
super
();
this
.
cp
= cp;
@Override
public
void
productClothing() {
out
.println(
"收取1000块钱的中介费"
);
cp
.productClothing();
LiNingCompany
implements
ClothingProduct {
@Override
public
void
productClothing() {
out
.println(
"生产一批衣服。。。。"
);
上面程序的做法,使用的模式是静态代理模式
静态代理模式在现实编程中的弊端:
它的特征是代理类和目标对象的类都是在编译期间确定下来的,不利于程序上的扩展,上面示例中,如果客户还想找一个“生产一批鞋子”的工厂,那么还需要新增加一个代理类和一个目标类。如果客户还需要很多其他的服务,就必须一一的添加代理类和目标类。那就需要写很多的代理类和目标类
动态代理技术
类 Proxy
Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
| 构造方法摘要 | |
|---|---|
protected |
Proxy(InvocationHandler h)使用其调用处理程序的指定值从子类(通常为动态代理类)构建新的 Proxy 实例。 |
| 字段摘要 | |
|---|---|
protected InvocationHandler |
h此代理实例的调用处理程序。 |
| 方法摘要 | |
|---|---|
static InvocationHandler |
getInvocationHandler(Object proxy)返回指定代理实例的调用处理程序。 |
static Class<?> |
getProxyClass(ClassLoader loader, Class<?>... interfaces)返回代理类的 java.lang.Class 对象,并向其提供类加载器和接口数组。 |
static boolean |
isProxyClass(Class<?> cl)当且仅当指定的类通过 getProxyClass 方法或 newProxyInstance 方法动态生成为代理类时,返回 true。 |
static Object |
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。 |
每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。
|
|
|---|---|
Object |
invoke(Object proxy, Method method, Object[] args)在代理实例上处理方法调用并返回结果。
|
java.lang.reflect.InvocationHandler;
java.lang.reflect.Method;
java.lang.reflect.Proxy;
java.util.ArrayList;
java.util.Collection;
class
Ts {
public
static
void
main(String[] args)
throws
Exception {
new
ArrayList();
// 代理只可以强转换成接口
new
MyAdvice());
out
.println(list);
public
static
Object getProxy(
final
Object target,
final
Advice adv)
/* 终态是因为内部类调用 */
{
// 返回一个指定接口的代理类实例 obj
// 定义代理类的类加载器
// 代理类要实现的接口列表
// 指派方法调用的调用处理程序 InvocationHandler
new
InvocationHandler() {
@Override
public
Object invoke(Object proxy, Method method,
throws
Throwable {
//target目标 ,args方法参数,调用原来的方法
return
retVal;
return
obj;
Advice {
void
begintime(Method method);
void
endtime(Method method);
MyAdvice
implements
Advice {
@Override
public
void
begintime(Method method) {
out
.println(method.getName() + time);
@Override
public
void
endtime(Method method) {
out
.println(method.getName() + time);
class
Ts {
public
static
void
main(String[] args)
throws
Exception {
new
ProxyHandler();
new
LiNingCompany());
ProxyHandler
implements
InvocationHandler {
/* 目标对象 */
private
Object
target
;
/* 创建目标对象的代理对象 */
public
Object newProxyInstance(Object target) {
this
.
target
= target;
/*
return
Proxy.newProxyInstance(
this
.
target
.getClass().getClassLoader(),
this
.
target
.getClass().getClasses(),
this
);
@Override
public
Object invoke(Object proxy, Method method, Object[] args)
throws
Throwable {
null
;
out
.println(
"目标对象上的方法调用之前可以添加其他代码。。。"
);
this
.
target
, args);
// 通过反射调用目标对象上的方法
out
.println(
"目标对象上的方法调用之后可以添加其他代码。。。"
);
return
result;
黑马程序员:Java基础总结----静态代理模式&动态代理的更多相关文章
- 黑马程序员----java基础笔记中(毕向东)
<p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...
- 黑马程序员——JAVA基础之简述设计模式
------- android培训.java培训.期待与您交流! ---------- 设计模式(Design Patterns) 设计模式(Design pattern)是一套被反复使用.多数人知晓 ...
- 黑马程序员Java基础班+就业班课程笔记全发布(持续更新)
正在黑马学习,整理了一些课程知识点和比较重要的内容分享给大家,也是给自己拓宽一些视野,仅供大家交流学习,大家有什么更好的内容可以发给我 ,现有黑马教程2000G QQ 1481135711 这是我总 ...
- 黑马程序员----java基础笔记上(毕向东)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...
- 黑马程序员_java基础笔记(13)...类加载器和代理
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 1,类加载器.2,代理. 1,类加载器. Java虚拟机中可以安装多个类加载器,系 ...
- 黑马程序员——JAVA基础之泛型和通配符
------- android培训.java培训.期待与您交流! ---------- 泛型: JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...
- 黑马程序员——JAVA基础之简述面向对象,类,变量,匿名对象
------- android培训.java培训.期待与您交流! ---------- 面向对象: 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 面向对象 将 ...
- 黑马程序员——JAVA基础之语法、命名规则
------- android培训.java培训.期待与您交流! ---------- 1.java语言组成:关键字,标识符,注释,常量和变量,运算符,语句,函数,数组. 2.java关键字:被Jav ...
- 黑马程序员——JAVA基础之主函数main和静态static,静态代码块
------- android培训.java培训.期待与您交流! ---------- 主函数:是一个特殊的函数.作为程序的入口,可以被jvm调用. 主函数的定义: public:代表着该函数访问权限 ...
- 黑马程序员——JAVA基础之多线程的安全问题
------- android培训.java培训.期待与您交流! ---------- 导致多线程出现问题的一个特殊的状态:就绪.具备了执行资格,但是还没有获取资源. 导致安全问题的出现的原因: 1. ...
随机推荐
- JEECG社区 一个微信教育站点案例源代码分享
微信教育站点案例演示: http://t.cn/RvPgLcb 源代码分享: http://pan.baidu.com/s/1cUImy 截图演示: watermark/2/text/aHR0cDov ...
- java环境变量配置问题
你要配置三个环境变量JAVA_HOMECLASSPATHPath你都配置了吗? 系统变量→新建 JAVA_HOME 变量 .变量值填写jdk的安装目录(本人是 E:\Java\jdk1.7.0) 系统 ...
- JDK 安装环境配置(ubuntu)
在Ubuntu 上安装jdk,先去官网下载相对应的tar包 网址:(这是jdk1.8) http://www.oracle.com/technetwork/java/javase/downloads/ ...
- C#获取千分位,给数字加逗号分隔符
/// <summary> /// 对数字添加”,“号,可以处理负数以及带有小数的情况 /// </summary> /// <param name="vers ...
- 基于visual Studio2013解决面试题之1002公共子串
题目
- windows下安装mysql5.6.13的主从复制
如下操作均在vmware 虚拟机中winows xp 测试成功 中间走了很多弯路,网上的很多资料都是针对5.1以前的版本,在新版中根本无法使用,所以根据自己的实践整理了这篇文章 主服务:192.168 ...
- 高性能MySql进化论(四):Summary,Cache,Counter表的使用
在实际的应用中,往往会定期的对一个周期内的系统数据进行统计分析.例如某购物网站定期的统计商品在一个月/年期内的销售情况,如果采用扫描所有相关表的方式在某个时间点进行统计分析, 由于数据量很大,以及表结 ...
- 在Android手机上获取其它应用的包名及版本
转载请注明出处:http://blog.csdn.net/jason_src/article/details/37757661 获取Android手机上其它应用的包名及版本方法有非常多,能够通过AAP ...
- js操作styleSheets
document.styleSheets这个接口可以获取网页上引入的link样式表和style样式表.比如 最后的输出结果如下. 换下代码看看我们具体的styleSheets具体输出什么 这些都是次要 ...
- 前端javascript框架之AngularJS学习笔记
<!doctype html><html lang="en" ng-app><head><meta charset="utf-8 ...