Java反射及注解学习- 反射的使用 - JDK动态代理
代理模式基本概念:
1.代理模式的作用:为其他对象提供一种以控制对方的访问
在某种情况下,一个客户不想或者不能直接引用另一个对象,代理可以在客户端和目标对象之间起到中介的作用
代理的角色:
(1)抽象角色:声明真实对象和代理对象的共同接口(比如租房,抽象角色就是把租房这件事给抽象成一个接口)
(2)代理角色:代理对象内部含有真实对象的引用,从而可以操纵真实的对象,同时代理对象提供与真实对象相同的接口,以便在任何时候都能代替真实对象。代理对象可以在执行真实对象操作时附加其他的操作(比如,租房时,中介收中介费),相对于真实对象进行封装。
(3)真实角色:代理对象所代理的真实角色,是我们要引用的对象
2.JDK动态代理
JDK动态代理可以为所有接口的实现类提供代理
动态代理开发步骤:
(1)创建一个实现接口InvocationHandler的类,它必须实现invoke方法
(2)创建被代理对象的类和接口
(3)通过Proxy.newProxyInstance()来创建代理类
(4)通过代理来调用被代理对象的方法
静态代理demo:模拟通过代理租房
package proxydemo;
public interface HireHouse {
public void hire();
}
HireHouse
package proxydemo;
public class HireHouseImpl implements HireHouse {
@Override
public void hire() {
System.out.println("我要租房");
}
}
HireHouseImpl
代理类,实现HireHouse接口,持有代理对象(真实对象的引用)
package proxydemo;
public class HireHouseProxy implements HireHouse {
private HireHouse hh;//代理对象,持有真实对象的引用
public HireHouseProxy(HireHouse hh) {
/*多态方式,接收接口的实现类对象,为静态代理,缺点是,只能给租房这件事做代理,
*因为传递进来的是HireHouse这个接口的实现类对象 ,不能代理其他的事情*/
super();
this.hh = hh;
}
@Override
public void hire() {
System.out.println("收中介费");//代理做的事情
hh.hire();//真实对象租房
System.out.println("扣押金");//代理做的
}
}
HireHouseProxy
调用代理类:
package proxydemo;
public class Client {
public static void main(String[] args) {
HireHouse proxyHire = new HireHouseProxy(new HireHouseImpl());
System.out.print("---通过代理租房:");
proxyHire.hire();//通过代理租房
System.out.print("---真实对象自己租房:");
new HireHouseImpl().hire();//真实对象自己租房
}
}
Client
动态代理demo:
package proxydemo.dynamic.proxy;
/**
* 真实对象和代理对象的共同接口,不仅仅能租房。
* @author Administrator
*
*/
public interface HireHouse { public void hire();
}
接口实现类:
package proxydemo.dynamic.proxy;
public class HireHouseImpl implements HireHouse {
@Override
public void hire() {
System.out.println("我要租房");
}
}
代理类,实现InvocationHandler 接口
package proxydemo.dynamic.proxy; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; /**
* 实现InvocationHandler接口,通过反射去调用被代理的接口
* @author Administrator
*
*/
public class HireProxy implements InvocationHandler {
// 被代理的真实角色
private Object obj;// 真实角色,要给任何对象做代理,只能是持有Object类型的对象 public HireProxy(Object obj) {
super();
this.obj = obj;
} /**
* jdk动态代理,被代理对象必须实现接口
* 被代理的对象必然实现共同的Hire接口,那么就有方法
* method:被代理的对象的接口中的方法,要调用方法,必须有对象,此处这个对象就是被代理对象,因此必须要指定被代理的对象
* args是被代理对象接口的方法的参数,调用proxy对象的method方法
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("前置工作");
// for (Object object : args) {
// System.out.print("invoke方法中的第三个参数:"+object +" ");//给list做代理时测试用
// }
Object invoke = method.invoke(obj, args);
System.out.println("\n后置工作");
return invoke;
} }
动态代理测试:
package proxydemo.dynamic.proxy; import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List; public class Client { public static void main(String[] args) {
// 创建被代理的接口实现类对象
HireHouseImpl hhi = new HireHouseImpl();
//创建代理对象:第一个参数是被代理的对象的类加载器,第二个是被代理对象的类的所有接口,第三个参数是自定义代理类的角色
HireHouse hh =
(HireHouse)Proxy.newProxyInstance(hhi.getClass().getClassLoader(),
hhi.getClass().getInterfaces(), new HireProxy(hhi));
hh.hire(); // 给list做代理
// List list = new ArrayList();
// List hh1 = (List) Proxy.newProxyInstance(list.getClass()
// .getClassLoader(), list.getClass().getInterfaces(),
// new HireProxy(list));
// hh1.add("张三");
// hh1.get(0);//被代理对象的所有方法都被代理了 }
}
Java反射及注解学习- 反射的使用 - JDK动态代理的更多相关文章
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring JDK动态代理
JDK 动态代理是通过 JDK 中的 java.lang.reflect.Proxy 类实现的.下面通过具体的案例演示 JDK 动态代理的使用. 1. 创建项目 在 MyEclipse 中创建一个名称 ...
- java学习笔记(中级篇)—JDK动态代理
一.什么是代理模式 相信大家都知道代理商这个概念,在商业中,代理商无处不在.假设你要去买东西,你不可能去找真正的厂家去买,也不可能直接跟厂家提出需求,代理商就是这中间的一桥梁,连接买家和厂商.你要买或 ...
- aop学习总结一------使用jdk动态代理简单实现aop功能
aop学习总结一------使用jdk动态代理实现aop功能 动态代理:不需要为目标对象编写静态代理类,通过第三方或jdk框架动态生成代理对象的字节码 Jdk动态代理(proxy):目标对象必须实现接 ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring CGLlB动态代理
JDK 动态代理使用起来非常简单,但是它也有一定的局限性,这是因为 JDK 动态代理必须要实现一个或多个接口,如果不希望实现接口,则可以使用 CGLIB 代理. CGLIB(Code Generati ...
- Java代理(静态代理、JDK动态代理、CGLIB动态代理)
Java中代理有静态代理和动态代理.静态代理的代理关系在编译时就确定了,而动态代理的代理关系是在运行期确定的.静态代理实现简单,适合于代理类较少且确定的情况,而动态代理则给我们提供了更大的灵活性. J ...
- 【Java】利用注解和反射实现一个"低配版"的依赖注入
在Spring中,我们可以通过 @Autowired注解的方式为一个方法中注入参数,那么这种方法背后到底发生了什么呢,这篇文章将讲述如何用Java的注解和反射实现一个“低配版”的依赖注入. 下面是我们 ...
- Java基础之反射生成JDK动态代理
在Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口.通过这个类和接口可以生成JDK动态代理类或动态代理对象. JDK动态代理例子: / ...
- 静态代理和利用反射形成的动态代理(JDK动态代理)
代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...
- java jdk动态代理学习记录
转载自: https://www.jianshu.com/p/3616c70cb37b JDK自带的动态代理主要是指,实现了InvocationHandler接口的类,会继承一个invoke方法,通过 ...
随机推荐
- “The creator of this fault did not specify a Reason” Exception
“The creator of this fault did not specify a Reason” Exception if(!DidItPass) { InvalidRoutingCodeFa ...
- pve之命令
pvesr list ha-manager status pvecm nodes pvecm status pveperf qm list root@cu-pve06:~# pvesr list Jo ...
- webService接口的py文件打包成exe
(一)webService接口的py文件打包成exe,在python3.5版本.pyInstaller3.2版本.pywin32-219.win-amd64-py3.5版本打包时报错,原因可能是pyi ...
- 007-TreeMap、Map和Bean互转、BeanUtils.copyProperties(A,B)拷贝、URL编码解码、字符串补齐,随机字母数字串
一.转换 1.1.TreeMap 有序Map 无序有序转换 使用默认构造方法: public TreeMap(Map<? extends K, ? extends V> m) 1.2.Ma ...
- Django 的工作流程和基本内容
1.一个基本的Django请求流程 我们先开始写一个基本的请求.这个请求的获取和处理,是使用 urls.py 和 views.py 处理的.我们使用命令 python manage.py runser ...
- Vagrant 手册之 Vagrantfile - 机器设置 config.vm
原文地址 配置的命名空间:config.vm config.vm 中的设置修改 Vagrant 管理的机器的配置. 1. 可用的设置项 config.vm.boot_timeout Vagrant 等 ...
- memcpy不能复制内存重叠区域,memmove可以拷贝重叠内存
http://blog.csdn.net/li_ning_/article/details/51418400 下面s和s2指向的内存区域有重叠,memcpy不能正确复制,src赋值给dst时,可能会修 ...
- 【报错】The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
提交表单之后, 报错页面显示: HTTP Status 404 – 未找到 Type Status Report 消息 Not found 描述 The origin server did not f ...
- 01 - Jmeter4.x环境安装以及简单使用
Jmeter 介绍 Apache JMeter应用程序是开源软件,旨在为负载测试功能行为和测量性能的100%纯Java应用程序.它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能 常用压力 ...
- 阿里云ECS服务安装 nginx+php+MariaDB完整版
安装 Nginx想在 CentOS 系统上安装 Nginx ,你得先去添加一个资源库,像这样: vim /etc/yum.repos.d/nginx.repo使用 vim 命令去打开 /etc/yum ...