`
lbfhappy
  • 浏览: 83239 次
社区版块
存档分类
最新评论

JAVA代理机制初探

阅读更多
今天上午写了一个有关于EJB的拦截例子,其实EJB的拦截用的就是JAVA的代理机制.说广一点,EJB的实现就是利用代理实现的远程方法调用.
EJB会在服务器端生成一个实现了所有的接口的类的代理,然后在里面监听你所做的所有事情,并与之反应,这样就实现了远程调用的效果,你在这边调用,而EJB容器在别的地方也可以知道你调用了什么,并返回与之对应的结果,这一切都是用代理来实现的.

下面我们就来认识一下,代理的主要类:java.lang.reflect.Proxy
它定义了一套静态方法,供我们使用,其中一个最常用的方法就是生成代理对象
public static Object newProxyInstance(ClassLoader loader,
                                      Class<?>[] interfaces,
                                      InvocationHandler h)
                               throws IllegalArgumentException

它根据你传入的类加载器和这个代理将会实现的接口,以及一个调用处理器,来生成一个代理对象.说起来比较抽象,还是给点例子吧:
先声明一个接口,用来调用代理的方法
/*
 * MyInterface.java
 *
 * Created on 2007年9月8日, 下午4:38
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 
*/

package test4;

/**
 *
 * 
@author hadeslee
 
*/
public interface MyInterface {
    
public void sayHello(String s);
    
public void doSth();
}

然后再写一个类实现此方法
/*
 * Test1.java
 *
 * Created on 2007年9月8日, 下午4:31
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 
*/

package test4;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;


/**
 *
 * 
@author hadeslee
 
*/
public class Test1 implements MyInterface{
    
    
/** Creates a new instance of Test1 */
    
public Test1() {
        
    }
    
    
public static void main(String[] args) throws Exception{
        Test1 list
=new Test1();
        MyInterface my
=(MyInterface)Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                list.getClass().getInterfaces(),
                
new MyHandler<MyInterface>(list));
        System.out.println(
"my.name="+my.getClass().getName());
        my.doSth();
        my.sayHello(
"千里冰封");
    }
    
//接口中的方法
    public void sayHello(String s) {
        System.out.println(
"sayHello to:"+s);
    }
    
//接口中的方法
    public void doSth() {
        System.out.println(
"doSth()");
    }
    
//一个静态内部类,实现了InvocationHandler的接口,
    
//它也是一个关键的接口,所有代理后的行为都是在这里实现的
    static class MyHandler<T> implements InvocationHandler{
        
private T t;
        
public MyHandler(T t){
            
this.t=t;
        }
        
//实现方法调用
        
//可以自己加上自己的一些调用,此例中只是在加上了一个输出
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println(
"我知道马上要被调用的方法是:"+method.getName());
            
return method.invoke(t,args);
        }
        
    }
}

运行上面的类输出是:

my.name=$Proxy0
我知道马上要被调用的方法是:doSth
doSth()
我知道马上要被调用的方法是:sayHello
sayHello to:千里冰封

从这里可以看出,代理的类的名字换成了$Proxy0,其中$Proxy是所有代理类的类名前缀
我们在调用doSth()和sayHello()的时候,都调用到了我们在代理中设置的输出.如果你想在这里代理别的类,也是可以的,只要你符合以上的调用规律.
最后特别要注意的一点是:

//实现方法调用
        
//可以自己加上自己的一些调用,此例中只是在加上了一个输出
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println(
"我知道马上要被调用的方法是:"+method.getName());
            
return method.invoke(t,args);
        }

在上面的实现中,千万不能调用method.invoke(proxy,args).因为proxy本身就是一个代理的对象,你如果再在它上面调用一个方法的话,会无限递归的调用这个方法,所以,在InvocationHandler的实现里面,最好是传一个代理对象的真正实现进去,这样就可以还原本来的调用结果,并加上自己的东西在里面.
分享到:
评论

相关推荐

    GWT通信机制初探

    标题 "GWT通信机制初探" 指的是探讨Google Web Toolkit (GWT) 的通信方式,这是一种用于构建高性能、跨浏览器的JavaScript应用程序的开发框架。GWT通过编译Java代码到JavaScript,允许开发者使用Java语言来编写前端...

    初探spring aop内部实现 java

    对于接口,Spring使用Java动态代理(JDK Proxy)创建代理对象;而对于类,Spring则使用CGLIB库生成子类代理。这两种方式都是在运行时生成代理对象,从而在方法调用前后插入切面逻辑。 接下来,我们转向DataSource的...

    Java ee 企业应用开发:第7章 在Spring中管理事务.ppt

    #### 7.1.1 从代理机制初探AOP 代理机制是AOP实现的基础。代理可以在目标对象前设置一个中介,处理额外的职责,例如日志记录。代理有两种主要形式: 1. **静态代理**:在编译时创建代理类,代理类和目标类都实现...

    Sharding生态圈初探.pptx

    《Sharding生态圈初探》 在当今的互联网领域,随着数据量的急剧增长,传统的RDBMS(关系型数据库管理系统)面临着高并发访问、高可用性以及存储稳定性等严峻挑战。RDBMS虽然具备强大的事务处理能力和数据一致性保证...

    spring 帮助文档

    Spring AOP实现了基于代理(proxy-based)的AOP机制,通过代理对象拦截目标对象的方法调用并执行额外的逻辑。 **3.1.2 Spring AOP基础概念** Spring AOP的核心概念包括切面(aspect)、连接点(join point)、通知...

    SpringBlade 开发手册.pdf

    Mapper、新增 API、修改 API、删除 API、查询 API、单条数据、多条数据、分页、微服务远程调用、声明式服务调用、Feign 熔断机制、Hystrix、生产部署、windows 部署、linux 部署、jar 部署、docker 部署、java 环境...

    开源框架 Spring Gossip

    从代理机制初探 AOP 动态代理 &lt;br&gt;AOP 观念与术语 Spring AOP Advices Advices 包括了Aspect 的真正逻辑,由于缝合至Targets的时机不同,Spring 提供了几种不同的 Advices。 Before ...

    Tomcat源码研究.pdf

    管理员可以通过JMX代理查询服务器状态、配置参数以及触发特定操作。 - **MBean 示例**:Tomcat中存在大量预定义的MBeans,这些MBeans代表了可被监控和管理的对象。例如,`Catalina:type=Manager` MBean可以用来管理...

    Jetty权威指南.pdf

    Jetty还可以与其他Web服务器(如Apache)配合使用,通过mod_proxy或AJP代理协议将请求转发给Jetty处理。 #### 九、虚拟主机 **9.1 虚拟主机的配置方法** Jetty支持在同一台物理服务器上托管多个虚拟主机。通过...

    Spring开发指南

    在Spring初探部分,首先涉及到的是准备工作,包括安装必要的开发环境和配置工具,为构建Spring基础代码做准备。接下来,指南会介绍Spring的基础语义,特别是依赖注入(Dependency Injection,简称DI)的概念及其在...

    ICE中间件教程

    - **1.3.2 Slice映射机制**:定义了如何将Slice中的定义映射到具体的编程语言中,如C++或Java。 **1.4 Ice协议** - **1.4.1 Ice协议的组成**:包括消息格式、序列化规则等,确保客户端和服务器之间的通信能够高效...

    clouds.zip

    《Spring Cloud深度解析:从clouds.zip初探分布式微服务架构》 在现代软件开发领域,微服务架构已经成为主流,而Spring Cloud作为Java生态中的重要一环,为构建分布式系统提供了全面的工具集。本文将基于名为...

    enterpriseSpider

    【企业级爬虫框架"enterpriseSpider"初探】 在当今数字化时代,数据是企业决策的重要依据,而网络爬虫作为一种高效的数据采集工具,被广泛应用于市场分析、竞争情报、用户行为研究等领域。"enterpriseSpider"便是一...

    Nginx开发从入门到精通.pdf.docx

    - Nginx使用了一套高效的请求处理机制,能够快速响应并处理客户端的请求。 - 包括请求接收、解析、路由转发等多个阶段。 6. **模块化体系结构**: - Nginx采用了模块化的架构设计,允许开发者编写自定义模块来...

Global site tag (gtag.js) - Google Analytics