Java中Proxy,Dynamic Proxy以及Reflection是什么关系呢?谈这个问题之前,我们要先了解三者究竟是什么东西。
一、Proxy。面向对象中Proxy是比较常用的,作为GOF 23个模式之一,Proxy在Design Patterns一书中有着详细的描述。Proxy的使用范围很广,下面以一个简单的访问控制为例。在这种情况下,外部使用者要想使用某个对象,必须通过该对象的代理进行。在这里,Proxy充当着“网关”的角色,这样,在外部触及到内部对象之前,我们可以做很多有意义的工作,如身份认证等。下面是一个简单的例子:
java 代码
- public class ProxyTest {
- public static void main(String[] args) {
- Job job = new Proxy(new Worker());
- job.code();
- }
- }
- interface Job{
- public void code();
- }
- class Proxy implements Job{
- private Worker wrk;
- public Proxy(Worker wrk){
- this.wrk = wrk;
- }
- public void code(){
-
- System.out.println("Check the permission");
- wrk.code();
-
- System.out.println("Get the saraly");
- }
- }
-
-
- class Worker implements Job{
- public void code() {
- System.out.println("Worker code actually");
- }
-
- }
二、Dynamic Proxy。上面的Proxy,也可以叫做静态代理,它的特征是代理和实际作业的对象的类都是在编译期间就已经定下来的。与此相对的是动态代理,其代理是在程序运行期间动态产生的。Java对动态代理提供了相应的API,但只能接口方法的动态代理。动态代理一个典型应用就是实现数据库的连接池。由于使用JDBC的程序员习惯在使用完数据库的Connection对象后调用该对象的close方法关闭连接,这样连接池就失去作用了。这个问题我们可以使用动态代理技术来解决,当程序员调用Connection的close方法时,我们将其拦截下来,将其归还到连接池中,而不是直接关闭物理连接。下面是动态代理的一个实例。
java 代码
- public class DynamicProxy {
- public static void main(String[] args) throws Exception {
- Job job = JobFactory.getJob();
- job.code();
- }
- }
- interface Job{
- public void code();
- }
-
- class Worker implements Job{
- public void code() {
- System.out.println("worker code");
- }
-
- public void play(){
- System.out.println("worker play");
- }
- }
- class Handler implements InvocationHandler{
- private Worker worker;
- public Handler(Worker worker){
- this.worker = worker;
- }
- public Object invoke(Object obj, Method mtd, Object[] objs) throws Throwable {
- Object res = null;
- System.out.println("check permission");
- res = mtd.invoke(worker, objs);
- System.out.println("get the saraly");
- return res;
- }
- }
- class JobFactory {
- public static Job getJob() {
- Worker worker = new Worker();
- if (!(worker instanceof Job ))
- return null;
-
- InvocationHandler handler = new Handler(worker);
-
- Class[] interfaces = new Class[] { Job.class};
- ClassLoader loader = JobFactory.class.getClassLoader();
- Job proxy = (Job) Proxy.newProxyInstance(loader, interfaces, handler);
- return proxy;
- }
- }
-
动态代理与普通的代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。在JDBC连接池的例子中,如果我们使用普通的代理模式进行,那么我们要对Connection中的每一个方法进行单独处理,那么是比较繁琐的。如果,我们用动态代理的方式,实现起来就比较优雅。
三、Reflection。Java中通过反射技术,我们可以在运行过程中得到相应类的各种方法和属性,并且可以进行修改和调用。动态代理技术就是基于反射实现的。当然,反射技术用处还很多,譬如JavaBean技术。
现在是比较清楚了,Proxy和Dynamic Proxy都是一种模式,两者实现的功能相当,但是方式不同;Reflection是实现后者的技术基础。
分享到:
相关推荐
java反射和动态代理,详细说明反射和动态代理的方法和使用!
Java反射机制与动态代理
反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
java反射与动态代理
java反射机制与动态代理 java反射机制 java反射机制java反射机制java反射机制java反射机制
详细讲解java的reflect包的,阐述反射机制及动态代理的细节问题。其中动态代理部分内容参考网上资料。读完此文,相信会对javaf反射机制有一个完整清楚的了解。尤其应该看看其他中代码举例部分。
java动态代理 public class HireProxy implements InvocationHandler { //被代理的真实角色 private Object obj; public HireProxy(Object obj) { super(); this.obj = obj; } //第二个参数method,被...
java反射机制和动态代理的原理,熟悉反射机制和动态代理
JAVA的反射机制与动态代理
介绍AOP动态代理很不错的一本技术书籍,里面又很多例子通俗易懂。
Java动态代理和Java反射的Demo演示,通俗易懂。
Java程序的工作机制:Java对象都以单独的class文件存在,java虚拟机将其载入并执行其虚拟机指令。
Java反射机制与动态代理 浪曦 Java Reflection API 简介 及动态代理
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
详细的反射-动态代理-注解
Java类反射 动态代理 讲解的很细,很受用 分享给大家
利用反射和动态代理机制实现自定义拦截器Interceptor http://blog.csdn.net/alanchen520/article/details/34087833
JAVA 反射机制与动态代理ppt,郎溪出品
深入地探讨反射和动态代理技术,其中例子详细明白。使初学者比较容易入门!