`

Java Proxy代理学习

阅读更多
在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;           
	}           


}
分享到:
评论

相关推荐

    proxy.rar java三种代理模式源码

    总结来说,"proxy.rar"压缩包提供了Java编程中三种代理模式的源代码实例,通过学习这些代码,开发者可以深入理解代理模式的原理和实现,同时掌握泛型在实际项目中的应用。对于提高代码的可扩展性和可维护性,这些都...

    Java_ProxyServer.rar_Java ProxyServer_java proxy server

    在Java_ProxyServer.rar中,"实例55"可能是包含具体代码实现的示例,这个实例可以作为学习和参考的对象,通过阅读和分析代码,可以更好地理解和掌握Java代理服务器的实现细节。在实际项目中,可以根据需求扩展Proxy...

    JavaProxy Demo

    在标题“JavaProxy Demo”中提到的,这是一个展示Java动态代理功能的示例程序。动态代理通常用于实现AOP(面向切面编程)或者在不修改目标对象的情况下增加额外的功能,比如日志、事务管理、性能监控等。 在Java中...

    从房屋买卖看 java proxy 模式

    对于学习和应用 Java 代理模式来说,熟悉这些源码是非常有益的。 至于压缩包中的 `sample3` 文件,由于没有提供具体内容,我们无法进一步分析。但根据上下文,它可能是包含示例代码或数据的文件,可能与上述代理...

    java 静态代理和动态代理学习实例源码

    Java提供了`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现动态代理。 1. **定义接口**:同样,我们首先定义一个接口。 ```java public interface Service { void execute(); } ``...

    Java 动态代理详解(学习资料)

    JDK 动态代理JDK 提供了 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来支持动态代理。Proxy 类用于创建一个代理对象,而 InvocationHandler 接口则定义了代理对象的方法调用处理逻辑。...

    httpProxy-java

    总的来说,"httpProxy-java"项目涉及的是使用Java实现HTTP代理服务的技术,涵盖了网络编程、HTTP协议、多线程以及可能的额外功能如性能优化和安全控制。通过对这些项目的研究和学习,开发者可以深入理解HTTP代理的...

    Proxy 模式学习代码

    2. **JDK动态代理**:Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供了动态生成代理对象的能力。在运行时,我们可以根据接口创建代理对象,而无需预先编写代理类。`...

    Java动态代理学习测试类

    在这个“Java动态代理学习测试类”中,我们将深入探讨这一主题。 1. **Java动态代理的基本概念** - 动态代理是在程序运行时生成接口的实现类,而无需在编译时就确定。这使得我们可以在运行时决定代理对象的行为。 ...

    代理模式java代码 Proxy(1)

    至于`中国java下载站.url`,这可能是一个链接到Java学习资源的网址,它并非代理模式的一部分,但强调了学习Java的重要性,尤其是对于理解和实践设计模式,如代理模式,这些资源可以帮助开发者扩展知识面,提升技能。...

    java动态代理 经典文章(word 2007格式的)

    Java动态代理是Java编程中一个重要...以上内容是对Java动态代理技术的概述,详细的学习和理解可以通过阅读给定的文档来深入探讨。在实践中,掌握动态代理能够帮助开发者编写更灵活、可扩展的代码,提高软件的可维护性。

    Java动态代理ReflectProxyDemo

    首先,Java中的动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现的。`Proxy`类用于创建一个代理对象,而`InvocationHandler`接口则定义了处理代理对象的方法调用的逻辑...

    netty proxy 代理例子

    在“netty proxy 代理例子”中,我们将会探讨如何利用 Netty 实现一个代理服务器,该代理服务器可以转发客户端的请求到目标服务器,并将响应回传给客户端。 首先,我们需要理解代理服务器的基本原理。代理服务器...

    Java代理学习

    Java代理的学习涵盖了面向接口编程、设计模式、反射等核心概念。静态代理适用于简单场景,代码可读性好,但维护成本高;动态代理则更灵活,适用于需要频繁创建不同代理对象的场景。通过深入理解这两种代理方式,...

    java 动态代理实现AOP

    ### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经...总之,通过本篇文章的学习,读者应该能够理解和掌握如何使用Java动态代理来实现AOP的基本原理及实践操作。

    Java动态代理案例演示代码

    Java动态代理基于JDK的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类用于创建代理类实例,而`InvocationHandler`接口定义了处理代理对象的方法调用的逻辑。 ### 2. 创建代理...

    java实现的代理服务器

    Java 实现的代理服务器是一种基于Java编程语言的网络服务,它的主要作用是充当客户端与目标服务器之间的...通过分析`HttpProxy.java`和`SubHttpProxy.java`的代码,我们可以深入学习网络编程和代理服务器的相关知识。

    Java实现动态代理

    在Java中,有两种方式实现动态代理:一种是通过Java的标准库`java.lang.reflect.Proxy`,另一种是使用Java的接口`java.lang.reflect.InvocationHandler`。我们先来看Proxy类,它是Java动态代理的核心,它提供了一种...

    apache开源项目源码commons-proxy-1.0-src(全部高质量代理模式proxy的java源程序)

    全部高质量代理模式proxy的java源程序 java.proxy,代理模式源码,设计模式,apache开源项目源码commons-proxy-1.0-src 各种代理模式操作的工具类源码以及代理模式案例源码,你会从中得到意想不到的效果! apache...

    用Java动态代理实现委托模式

    Java中的动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类用于创建一个实现了特定接口的代理对象,而InvocationHandler接口则定义了代理对象处理方法调用的方式...

Global site tag (gtag.js) - Google Analytics