今天上午写了一个有关于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通信机制初探" 指的是探讨Google Web Toolkit (GWT) 的通信方式,这是一种用于构建高性能、跨浏览器的JavaScript应用程序的开发框架。GWT通过编译Java代码到JavaScript,允许开发者使用Java语言来编写前端...
对于接口,Spring使用Java动态代理(JDK Proxy)创建代理对象;而对于类,Spring则使用CGLIB库生成子类代理。这两种方式都是在运行时生成代理对象,从而在方法调用前后插入切面逻辑。 接下来,我们转向DataSource的...
#### 7.1.1 从代理机制初探AOP 代理机制是AOP实现的基础。代理可以在目标对象前设置一个中介,处理额外的职责,例如日志记录。代理有两种主要形式: 1. **静态代理**:在编译时创建代理类,代理类和目标类都实现...
《Sharding生态圈初探》 在当今的互联网领域,随着数据量的急剧增长,传统的RDBMS(关系型数据库管理系统)面临着高并发访问、高可用性以及存储稳定性等严峻挑战。RDBMS虽然具备强大的事务处理能力和数据一致性保证...
Spring AOP实现了基于代理(proxy-based)的AOP机制,通过代理对象拦截目标对象的方法调用并执行额外的逻辑。 **3.1.2 Spring AOP基础概念** Spring AOP的核心概念包括切面(aspect)、连接点(join point)、通知...
Mapper、新增 API、修改 API、删除 API、查询 API、单条数据、多条数据、分页、微服务远程调用、声明式服务调用、Feign 熔断机制、Hystrix、生产部署、windows 部署、linux 部署、jar 部署、docker 部署、java 环境...
从代理机制初探 AOP 动态代理 <br>AOP 观念与术语 Spring AOP Advices Advices 包括了Aspect 的真正逻辑,由于缝合至Targets的时机不同,Spring 提供了几种不同的 Advices。 Before ...
管理员可以通过JMX代理查询服务器状态、配置参数以及触发特定操作。 - **MBean 示例**:Tomcat中存在大量预定义的MBeans,这些MBeans代表了可被监控和管理的对象。例如,`Catalina:type=Manager` MBean可以用来管理...
Jetty还可以与其他Web服务器(如Apache)配合使用,通过mod_proxy或AJP代理协议将请求转发给Jetty处理。 #### 九、虚拟主机 **9.1 虚拟主机的配置方法** Jetty支持在同一台物理服务器上托管多个虚拟主机。通过...
在Spring初探部分,首先涉及到的是准备工作,包括安装必要的开发环境和配置工具,为构建Spring基础代码做准备。接下来,指南会介绍Spring的基础语义,特别是依赖注入(Dependency Injection,简称DI)的概念及其在...
- **1.3.2 Slice映射机制**:定义了如何将Slice中的定义映射到具体的编程语言中,如C++或Java。 **1.4 Ice协议** - **1.4.1 Ice协议的组成**:包括消息格式、序列化规则等,确保客户端和服务器之间的通信能够高效...
《Spring Cloud深度解析:从clouds.zip初探分布式微服务架构》 在现代软件开发领域,微服务架构已经成为主流,而Spring Cloud作为Java生态中的重要一环,为构建分布式系统提供了全面的工具集。本文将基于名为...
【企业级爬虫框架"enterpriseSpider"初探】 在当今数字化时代,数据是企业决策的重要依据,而网络爬虫作为一种高效的数据采集工具,被广泛应用于市场分析、竞争情报、用户行为研究等领域。"enterpriseSpider"便是一...
- Nginx使用了一套高效的请求处理机制,能够快速响应并处理客户端的请求。 - 包括请求接收、解析、路由转发等多个阶段。 6. **模块化体系结构**: - Nginx采用了模块化的架构设计,允许开发者编写自定义模块来...