Dynamic Proxy 包含:其中有最常见的两种,JDK动态代理和CGLIB;还有javaassist,ASM(底层使用指令,可维护性较差);本文主要讨论java的JDK动态代理(反射机制。java.lang.reflect.proxy,java.lang.reflect.InvocationHandler(处理器接口))
下面是jdk动态代理的代码:
需要实现功能接口
package com.dasenlin.cn;
/**
* Star需要满足的某些功能
* @author Administrator
*
*/
public interface Star {
void singContact();
void contactWay();
void bookStick();
void Sing();
}
真正功能实现类
package com.dasenlin.cn;
/**
* 具体的歌者所要实现的功能
* @author Administrator
*
*/
public class RealStar implements Star {
@Override
public void singContact() {
System.out.println("RealStar.singContact()");
}
@Override
public void contactWay() {
System.out.println("RealStar.contactWay");
}
@Override
public void bookStick() {
System.out.println("RealStar.bookStick");
}
@Override
public void Sing() {
System.out.println("周杰伦RealStar.Sing");
}
}
代理类
package com.dasenlin.cn;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* jdk自带的动态代理
* @author Administrator
*
*/
public class StarHandler implements InvocationHandler {
/**
* 需要传递的参数
*/
private Star realStar;
/**
* 一个构造器负责传递参数
* @param realStar
*/
public StarHandler(Star realStar) {
super();
this.realStar = realStar;
}
/**
* java自带的的代理助手所包含的
* 所有的方法被代理后都会走到这个invoke方法
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object obj=null;
System.out.println("方法处理前");
if(method.getName().equals("Sing")){
obj=method.invoke(realStar, args);//这是假设有返回参数的
}
System.out.println("方法处理后");
return obj;
}
}
测试类
package com.dasenlin.cn;
import java.lang.reflect.Proxy;
/**
* 实现代理类
* @author Administrator
*
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
Star realStar = new RealStar();
StarHandler handler =new StarHandler(realStar);
Star proxy =(Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class},handler);
proxy.bookStick();
proxy.Sing();
}
}