如何才能实现jdk动态代理



如何才能实现jdk动态代理,jdk动态代理的简单实现。动态代理其实就是java.lang.reflect.Proxy类动态的根据您指定的所有接口生成一个class byte,该class会继承Proxy类,并实现所有你指定的接口(您在参数中传入的接口数组);然后再利用您指定的classloader将 class byte加载进系统,最后生成这样一个类的对象,并初始化该对象的一些值,如invocationHandler,以即所有的接口对应的Method成 员。 初始化之后将对象返回给调用的客户端。这样客户端拿到的就是一个实现你所有的接口的Proxy对象。

package invocation;

public interface PlayerInterface {
public void kick();
}

 

package invocation;

public class Player implements PlayerInterface{
public void kick(){
System.out.println(“我要赚钱”);
}
}

 

package invocation;

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

public class PlayerHandler implements InvocationHandler {


private Object target;

public PlayerHandler(Object target) {
this.target = target;
}

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println(“start”);
try {
return method.invoke(target, args);
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println(“over”);
}
return null;
}

public Object createObjectProxy(){
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this
);
}
}

 

package invocation;

public class Test {
public static void main(String[] args) {
/* 真实对象 */
Player p = new Player();

/* handler处理类 */
PlayerHandler handler = new PlayerHandler(p);

// 动态代理需要用接口去cast 如果实例cast则会报异常…
// Exception in thread “main” java.lang.ClassCastException: $Proxy0
// Player player = (Player)handler.createObjectProxy();
PlayerInterface player = (PlayerInterface)handler.createObjectProxy();
player.kick();
}
}