代理模式是Java 设计模式中很常用的一种设计模式,它的特点是代理类和被代理类具有相同的接口,这样代理类才能代理被代理类。当我们执行被代理类的某些方法的时候,委托给代理类,代理类可以在被代理类方法的执行前后多做一些事情。类似于Spring中的AOP
代理类可分为两种形似。一种为静态代理类,由程序开发人员自己编写代理类;另外一种为动态代理类,在程序运行时,运用反射机制动态生成。动态代理类不需要程序开发人员编写源代码。运用Java的反射机制生成,扩展容易。
java.lang.reflect 包中的Proxy类和InvocationHandler接口提供了生成动态代理类的功能。
Proxy类通过静态方法创建代理类和代理类的实例
下面通过一个简单的实例讲解如何使用动态代理
首先创建一个简单的接口IHello,其中只有一个方法sayHello,无论是常规类,还是代理类都需要实现此接口。
package dynamicpro;
public interface IHello {
public void sayHello();
}
创建实现此接口的类HelloImpl,此类为日后的被代理类
package dynamicpro;
public class HelloImpl implements IHello {
public HelloImpl() {
}
public void sayHello() {
System.out.println("Hello World");
}
}
下面通过工厂方法创建动态代理类及其实例
package dynamicpro;
import java.lang.reflect.*;
public class HelloFactory {
public HelloFactory() {
}
public static IHello getHelloProxy(final IHello hello){
InvocationHandler handler=new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args) throws
Throwable {
System.out.println("before calling "+method);
Object result=method.invoke(hello,args);
System.out.println("after calling "+method);
return result;
}
};
Class classType=IHello.class;
return (IHello)Proxy.newProxyInstance(classType.getClassLoader(),new Class[]{classType},handler);
}
}
创建动态代理类时,使用
Proxy.newProxyInstance方法。此方法需要InvocationHandler接口类型的参数。所以创建
InvocationHandler对象,并实现invoke方法。当动态代理类代理其他的类的时候,调用此方法。invoke方法的三个参数分别为:代
理类对象,调用的被代理类的方法,方法的参数。我们可以在invoke方法中编写适当的代码,当执行被代理类的方法的时候多做置前和置后的一些处理。比如
这里只是在方法的执行前后输出一些内容。
Proxy.newProxyInstance方法返回动态
代理类的实例,第一个参数指名被代理类的类型,显然是IHello接口类型,第二个参数是被代理类所实现的所有的接口类型。显然也是
IHello.class。第三个参数即为刚才创建的InvocationHandler对象,当执行被代理类的方法时候,调用其中的invoke方法。
编写测试类进行测试:
package dynamicpro;
public class HelloTest {
public HelloTest() {
}
public static void main(String[] args) {
IHello hello=new HelloImpl();
IHello helloProxy=HelloFactory.getHelloProxy(hello);
helloProxy.sayHello();
}
}
运行结果如下:
before calling public abstract void dynamicpro.IHello.sayHello()
Hello World
after calling public abstract void dynamicpro.IHello.sayHello()
分享到:
相关推荐
使用JAVA中的动态代理实现数据库连接池
Java实现动态代理的两种方式。 相对来说cglib更加方便。可以实现为实现接口的类(非final类)
这个是个人做的JAVA实现动态代理的笔记
java反射与动态代理
详见:https://blog.csdn.net/qq_37651267/article/details/90083914
Java实现简单动态代理连接池
用Java动态代理实现AOP,讲的很好(用Java动态代理实现AOP)
实现了一份jdk动态代理的demo,做了详细注释,供以后复习使用,另外,这里为什么需要大于100个字节才能传资源?我就不想那么多不行吗???
java动态代理对象实现日志输出,另外再配上annotation实现注解输出。
讲述JAVA的动态代理的原理,以及通过JAVA的动态代理来实现AOP。简洁,易懂,学习AOP的入门级文档
基于Java实现的代理服务器,实现socks4,socks5协议
Java 实现免费代理IP的获取方式 并动态实时校验是否有效,java文件项目内含有Jsoup的Jar包(Jsoup是加工过的,含请求),有2个主入口程序: 其一:用于请求代理IP,并立即校验是否是一个有效的代理IP,如果有效,...
使用Java编写的反向代理程序(源代码),通过简单的参数配置即可实现某些特定站点的反向代理,并在此过程中改变一些站点的特定行为。例如:允许特点站点跨域访问被代理的站点,或者屏蔽被代理站点识别请求访问客户端...
用java自己实现的动态代理,实现AOP功能
详细介绍了开发java动态代理用到的相关类,和动态代理类的特点!最后以完整示例代码的形式,展现了java动态代理开发的过程!
在Java中,其反射和动态代理机制极其强大,我们可以通过其反 射机制在运行时获取信息。而代理是一种基本的设计模式,它是一种为了提供额外的或不同的操作而插入到真 实对象中的某个对象。而Java的动态代理在代理上...
模拟java动态代理实现机制