spring入门(13)---JDK动态代理 (二)

2014-11-24 11:10:40 · 作者: · 浏览: 1
(){

System.out.println("---------------------目标方法之前执行");

}

public void afterMethod(){

System.out.println("---------------------目标方法之后执行");

}

}
[java]
package www.csdn.spring.jdk.proxy;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

/**

* JDK动态代理

* @author redarmy


*/

public class JDKProxy implements InvocationHandler {

// 代理目标对象
private Object target;

// 创建目标对象的的代理对象
public Object createProxyInstance(Object target) {
this.target = target;// 代理的目标对象
// 创建代理对象
// 1、定义代理类的类加载器
// 2、代理类要实现的接口列表
// 3、 指派方法调用的调用处理程序
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);

}
/**
* proxy:目标对象的代理实例method:对于代理实例调用接口方法的Method实例args:方法参数
*/

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {

// 声明返回值
Object returnValue = null;
beforeMethod();
// 执行目标方法
returnValue = method.invoke(target, args);
afterMethod();
// 修改返回值
return returnValue;

}

public void beforeMethod(){

System.out.println("---------------------目标方法之前执行");

}

public void afterMethod(){

System.out.println("---------------------目标方法之后执行");

}

}

package www.csdn.spring.jdk.proxy;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

/**

* JDK动态代理

* @author redarmy


*/

public class JDKProxy implements InvocationHandler {

// 代理目标对象
private Object target;

// 创建目标对象的的代理对象
public Object createProxyInstance(Object target) {
this.target = target;// 代理的目标对象
// 创建代理对象
// 1、定义代理类的类加载器
// 2、代理类要实现的接口列表
// 3、 指派方法调用的调用处理程序
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);

}
/**
* proxy:目标对象的代理实例method:对于代理实例调用接口方法的Method实例args:方法参数
*/

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {

// 声明返回值
Object returnValue = null;
beforeMethod();
// 执行目标方法
returnValue = method.invoke(target, args);
afterMethod();
// 修改返回值
return returnValue;

}

public void beforeMethod(){

System.out.println("---------------------目标方法之前执行");

}

public void afterMethod(){

System.out.println("---------------------目标方法之后执行");

}

}5、测试说明

[java]

package www.csdn.spring.jdk.proxy;

import org.junit.Test;

public class TestSay {

@Test

public void say(){

//真实主题角色
SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl();

//代理角色
JDKProxy jdkProxy = new JDKProxy();
SayGoodBye sayProxy = (SayGoodBye) jdkProxy.createProxyInstance(sayGoodByeImpl);

//代理说:
sayProxy.say("你和他分手吧!!!");

}
}






[java] view plaincopyprint
  1. package www.csdn.spring.jdk.proxy;
  2. import org.junit.Test;
  3. public class TestSay {
  4. @Test
  5. public void say(){
  6. //真实主题角色
  7. SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl();
  8. //代理角色
  9. JDKProxy jdkProxy = new JDKProxy();
  10. SayGoodBye sayProxy = (SayGoodBye) jdkProxy.createProxyInstance(sayGoodByeImpl);
  11. //代理说:
  12. sayProxy.say("你和他分手吧!!!");
  13. }
  14. }