您的位置:首页 > 编程语言 > Java开发

java实现JDK动态代理

2017-08-24 08:53 417 查看
1:创建一个接口HelloWorld

package dynamicproxy;

public interface HelloWorld {  //首先定义一个接口,产生代理对象。真实对象为实现类。
void sayHello();
void sayHelloString(String s);
}


2:创建实现了代理对象(接口)的真实对象SayHelloWorld ,ImpHelloWorld

package dynamicproxy;

public class SayHelloWorld implements HelloWorld {  //实现了代理对象的真实对象。

public void sayHello() {
// TODO Auto-generated method stub
System.out.println("Hello World");
}
public void sayHelloString(String s){
System.out.println(s+"Hello World");
}

}

package dynamicproxy;

public class ImpHelloWorld implements HelloWorld{

public void sayHello() {
// TODO Auto-generated method stub
System.out.println("imp Hello World");
}

public void sayHelloString(String s) {
// TODO Auto-generated method stub
System.out.println(s+"imp Hello World");
}

}


3:建立代理对象和真实对象之间的绑定关系和逻辑方法 JDKDynamicProxy implements InvocationHandler

package dynamicproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
* 代理逻辑类必须实现  InvocationHandler
* @author admin
* @version 1.0
*
*/
public class JDKDynamicProxy implements InvocationHandler {
Object target=null;

/**
* 建立代理对象和真实对象的代理关系,并返回代理对象
* @param target真实对象
* @return 返回代理对象
*/
public Object bind(Object target) {  //动态代理绑定
// TODO Auto-generated method stub
this.target=target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}

/**
* 代理方法逻辑
* @param proxy代理对象
* @param method 当前调度方法
* @param args 当前方法参数
* @return 代理结果返回
* @throws Throwable 异常
*/
public Object invoke(Object proxy, Method method, Object[] args) //代理逻辑实现
throws Throwable {
System.out.println("进入代理逻辑方法");
System.out.println("在调度真实对象之前的服务");

Object obj=method.invoke(target, args);  //相当于调用sayHello,调用真实对象
//target.invoke;相当于真实对象调用方法
System.out.println("在调度真实对象之后的服务");
return obj;
}
}


4:主函数调用

package dynamicproxy;

public class DynamicProxy {

/**
* 动态代理:
* 1,定义一个接口,作为代理对象
* 2,创建真实对象(可以有多个),实现代理对象。里面有真实对象要做的事情(方法)
* 3,创建实现了InvocationHandler的对象,该对象进行了动态代理绑定,和代理逻辑实现,
*   逻辑实现里面在真实对象方法前后可以加入代理对象自己的逻辑。
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
JDKDynamicProxy jdk=new JDKDynamicProxy();  //创建实现了InvocationHandler的对象。
//该对象进行了动态代理绑定,和代理逻辑实现
//绑定关系,因为挂在接口HelloWorld下,所以声明对象HelloWorld proxy,
HelloWorld proxy=(HelloWorld)jdk.bind(new SayHelloWorld());   //HelloWorld代理了其实现类SayHelloWorld
//此时HelloWorld对象已经是一个代理对象,它会进入代理逻辑方法invoke里

HelloWorld proxy1=(HelloWorld) jdk.bind(new ImpHelloWorld());
proxy.sayHello();  //当前调度方法,调用整个invoke方法,里面也含有代理对象自己的逻辑。
proxy.sayHelloString("String");

proxy1.sayHello();//会进入代理逻辑invoke里,把这个方法调用放在Object obj=method.invoke(target, args);
//相当于真实对象调用sayHello()。但是前后加上了动态代理的逻辑。
//obj说明有些函数可能会有返回值
proxy1.sayHelloString("String");
}
}


5:输出结果:

进入代理逻辑方法

在调度真实对象之前的服务

imp Hello World

在调度真实对象之后的服务

进入代理逻辑方法

在调度真实对象之前的服务

Stringimp Hello World

在调度真实对象之后的服务

进入代理逻辑方法

在调度真实对象之前的服务

imp Hello World

在调度真实对象之后的服务

进入代理逻辑方法

在调度真实对象之前的服务

Stringimp Hello World

在调度真实对象之后的服务

6:结构图:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: