在Java中利用代理(Proxy)可以在运行时创建一个实现了一组给定接口的新类。
在系统程序设计中,有时需要面对无法确定接口,却需要构造对象的情况。以前为了解决此问题,有些程序根据动态确定的接口,生成Java类文件,然后调用类加载器构造该对象,然后使用,这样一来无可避免性能问题。通过代理类,能够在不额外创建Java文件的情况下构造对象及调用该对象方法。
使用代理的理由有很多,其中就有如下的情况:
1.路由对远程服务器的方法调用
2.在程序运行期间,将用户接口事件与行动关联起来
3.调试时跟踪方法调用
以下举出一例,使用代理和调用处理器跟踪方法调用
HelloWorld.class接口
public interface HelloWorld {
public void SayHello(String name);
}
HellWorld实现类
public class HelloWorldImpl implements HelloWorld {
public void SayHello(String name) {
System.out.println("Hello,"+name);
}
}
测试类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。
//该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类
public class ProxyTest {
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorldImpl();
DynamicProxy dp = new DynamicProxy();
//在这里绑定的是HelloWorld,也就是HelloWorld是被代理接口。所以绑定关系时,需要传递一个HelloWorld的实现类的实例化对象。
HelloWorld helloWorld1 = (HelloWorld)dp.bindRelation(helloWorld);
helloWorld1.SayHello("cookies");
System.out.println(Proxy.isProxyClass(helloWorld1.getClass()));
//helloWorld2将不被拦截
HelloWorld helloWorld2 = new HelloWorldImpl();
helloWorld2.SayHello("cookies");
}
}
class DynamicProxy implements InvocationHandler
{
private Object object;
//绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。
//Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法
public Object bindRelation(Object object){
this.object = object;
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);
}
//拦截关联的这个实现类的方法被调用时将被执行
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Welcome");
Object result = method.invoke(object, args);
return result;
}
}
分享到:
相关推荐
代理模式java代码 Proxy(1) java 学习必备......
java static proxy dynamic proxy
Proxy 模式学习代码,包括静态代理,动态代理,cglib等
全部高质量代理模式proxy的java源程序 java.proxy,代理模式源码,设计模式,apache开源项目源码commons-proxy-1.0-src 各种代理模式操作的工具类源码以及代理模式案例源码,你会从中得到意想不到的效果! apache...
主要介绍了Java动态代理语法Proxy类原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
java 动态代理 测试类
浪曦经典Java代码--反射+代理reflection_proxy源码 优秀代码,值得java学习者学习!
自己开发,自己用于调试的源代码。主要用于调试监控网络的数据。可以做为一个简单的代理,监控工具。 源代码比较简单,大家需要的话可供学习使用。
在动态代理学习(二)JDK动态代理源码分析中我已经讲JDK底层生成的字节码文件反编译成了java代码,如下: public final class proxy extends Proxy implements MyService { private static Method m1; private ...
一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...
该资源包中分别使用单例,工厂,代理三种java开发模式,注释清晰,方便学习容易,,,通过小例子的演示让你轻松学会这三种开发模式!最重要的是物美价廉呢
* * * * JDK动态代理 JDK动态代理 JDK动态代理是通过java.lang.reflect.Proxy 类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现...
笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...
一个是IoC,另一个是AOP,对于IoC,依赖注入不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理是java的动态代理机制...
象以后我门在学习JAVA 的时候,一定要对每个知识点要慢慢的消化吃透,切不能走马观花。一个知识点必须要反复的动手练习,不然很难理解其中的奥秘所在的! 5.在JAVA的程序中,我经常性的看到字符前面有@这种标志的...
那个最近想看看Spring AOP的动态代理到底是个咋回事,特地学习了一下,写了个文档。 本文档先讲解了JDK的反射机制,然后是Proxy的动态代理、CGLIB的动态代理,因为这些是Spring AOP的底层技术,清楚了它们,你就更...
包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...
包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...
SimpleWebProxy 一个用Java编写的简单HTTP / 1.0代理。 这是为我的网络课程的家庭作业而编写的,用于学习目的。怎么跑cd src/javac *# java WebProxy <port>java WebProxy 8080它支持什么HTTP / 1.0 GET,HEAD,POST...
第11章 代理(proxy)模式 97 第12章 职责链(chain of responsibility)模式 115 第13章 享元(flyweight)模式 122 第14章 构造型模式介绍 130 第15章 构建者(builder)模式 134 第16章 工厂方法(factory method)模式 141...