首先定义一个接口
public interface IStars {
void sing();
void dance();
}
其中有两个对应star的方法,dance和sing;
然后定义一个star类来实现这个接口
public class Stars implements IStars {
private String name;
public Stars(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void sing() {
System.out.println(getName() + "唱了一首歌");
}
@Override
public void dance() {
System.out.println(getName() + "跳了一支舞");
}
}
这时,需要一个代理类来实现对star类的动态代理,即定义一个代理类
public class StarsNewProxy implements InvocationHandler {
private Object object;
public StarsNewProxy(Object o){
this.object = o;
}
private boolean runBefore(Method method){
System.out.println("拦截到代理请求");
if(method.getName().equals("dance")){
System.out.println("明星脚受伤了,不能跳舞表演了");
return false;
}
return true;
}
private void runAfter(Method method){
System.out.println(method.getName() + "代理请求完毕");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(!runBefore(method))
return null;
Object result = method.invoke(object, args);
runAfter(method);
return result;
}
}
实现InvocationHandler接口,重写invoke方法,其中的method.invoke即是执行这个方法,除此之外还可以在执行这个方法前和方法后定义一些其他的操作,有点类似于AOP的思想。
接下来我们实现一个测试类
public class Test {
public static void main(String[] args) {
IStars iStars = new Stars("Frank");
InvocationHandler handler = new StarsNewProxy(iStars);
IStars proxy = (IStars) Proxy.newProxyInstance(iStars.getClass().getClassLoader(), iStars.getClass().getInterfaces(), handler);
proxy.dance();
proxy.sing();
}
}
执行结果如下:
本文中的动态代理是通过JDK动态代理机制实现的,必须要先实现业务接口,即IStar接口;然后根据反射机制找到对应的被代理的类,就可以在动态生成的代理类中调用业务实现类的同名方法。