上一次说了java的代理模式。
其实java自己就提供了动态代理帮助我们实现代理模式,他的核心思想是在编写程序时不关心程序要代理谁,而是在运行的时候才关心我要代理谁。
java.lang.reflect.InvocationHandler是JDK提供的动态代理接口,对被代理类的方法进行代理。
invoke方法是接口InvocationHandler定义必须实现的,它完成对真实方法的调用。
动态代理是根据被代理的接口生成所有的方法,也就是先给定一个接口,动态代理会宣称“我已经实现该接口下的所有方法了”。通过InvocationHandler接口,所有方法都由该Hander来进行处理,即所有被代理的方法InvocationHandler接管实际的处理任务。
所以可以看到,被动态代理的类是必须要实现接口的,因为只有通过这个接口才能生成一个与被代理类配套的类。如果没有实现接口怎么办呢?Spring的做法是通过CGLIB来实现动态代理,也就是在加载字节码文件的时候来动态的产生代理类。
package com.gengu.代理.动态代理;
/** 抽象类*/
public interface Subject {
public void doSomeThing();
public void doanyThing();
}
需要被代理的类
package com.gengu.代理.动态代理;
public class RealSubject implements Subject{
@Override
public void doSomeThing() {
System.out.println("doSomeThing");
}
@Override
public void doanyThing() {
System.out.println("doAnyThing");
}
}
动态代理类,这里就显示的告诉程序代理到底该怎么做到,该增强什么功能,该监听什么之类的。
package com.gengu.代理.动态代理;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**动态代理类*/
public class MyProxy implements InvocationHandler{
//拦截类
Intercept intercept=new Intercept();
//代理者
Object object = null;
//需要代理谁
public MyProxy(Object _obj){
this.object = _obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] arg2)
throws Throwable {
intercept.Before();
Object obj = method.invoke(this.object, arg2);
intercept.After();
return obj;
}
}
监听类或者切面类,面向切面编程的思想
package com.gengu.代理.动态代理;
public class Intercept {
public void Before(){
System.out.println("在调用方法之前");
}
public void After(){
System.out.println("在调用方法之后");
}
}
测试类
package com.gengu.代理.动态代理;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
* 测试类
* */
public class Client {
public static void main(String[] args) {
//先得到需要被代理的类
Subject subject = new RealSubject();
//invocationHandler
InvocationHandler invocationHandler = new MyProxy(subject);
//类加载器
ClassLoader classLoader = subject.getClass().getClassLoader();
//动态产生一个代理者
Subject subject2 = (Subject)Proxy.newProxyInstance(classLoader, new Class[]{Subject.class}, invocationHandler);
subject2.doSomeThing();
}
}
以上就是我对java动态代理的一点理解
分享到:
相关推荐
java动态代理实例 要想理解拦截器的知识 最好要先理解java动态代理这块
java动态代理 public class HireProxy implements InvocationHandler { //被代理的真实角色 private Object obj; public HireProxy(Object obj) { super(); this.obj = obj; } //第二个参数method,被...
Java 动态代理详解(学习资料);Java 动态代理详解(学习资料);Java 动态代理详解(学习资料);Java 动态代理详解(学习资料);Java 动态代理详解(学习资料);
适用于初探java动态代理模式,精简易懂。
对代理模式与Java动态代理类的理解说明
java 动态代理 简单实例 新手看看
Java动态代理的helloworld,抛砖引玉吧
描述java动态代理,说明了怎么实现java的动态代理
Java 动态代理 借用电子商务模式来说明
更好的了解java动态代理的原理!
java动态代理 经典文章(word 2007格式的) 要用word 2007看
一个简单的java动态代理的实例
用Java动态代理实现AOP,讲的很好(用Java动态代理实现AOP)
Java动态代理实现数据源连接池,用代理类实现的连接池代码,绝对完整的案例,下载源码就能跑起来!Java动态代理实现数据源连接池,用代理类实现的连接池代码
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类: (1) Interface InvocationHandler (2) Proxy:该类即为动态代理类,
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类: (1) Interface InvocationHandler (2) Proxy:该类即为动态代理类,
java动态代理项目实践优化(3)
Java实现动态代理的两种方式。 相对来说cglib更加方便。可以实现为实现接口的类(非final类)
java动态代理 完整版 java动态代理 完整版 java动态代理 完整版 java动态代理 完整版 java动态代理 完整版
java动态代理的机制分析,以及相应的拓展。有详细的代码和实例加以分析。