01、书写接口
package cn.itcast.demo1;
public interface kindwomen {
public void throwEye(double money);
public void dosomething();
}
02、书写被代理类
package cn.itcast.demo1;
public class PJL implements kindwomen{
public void throwEye(double money){
System.out.println("潘金莲抛媚眼。。。"+money);
}
public void dosomething(){
System.out.println("潘金莲...");
}
}
03、书写代理对象并执行代理方法
package cn.itcast.demo1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class XMQ {
public static void main(String[] args) {
//创建一个目标对象
final kindwomen kw = new PJL();
//创建一个动态代理对象
//产生代理类的实例。仅能代理实现至少一个接口的类
// ClassLoader:类加载器。固定写法,和被代理类使用相同的类加载器即可。
// Class[] interface:代理类要实现的接口。固定写法,和被代理类使用相同的接口即可。
// InvocationHandler:策略(方案)设计模式的应用。代理对象如何调用真实对象的方法。
kindwomen wp = (kindwomen)Proxy.newProxyInstance(kw.getClass().getClassLoader(), kw.getClass().getInterfaces(), new InvocationHandler() {
// InvocationHandler中的invoke方法:调用代理类的任何方法,此方法都会执行
// Object proxy:代理对象本身的引用。一般用不着。
// Method method:当前调用的方法。m.invoke(p,null);
// Object[] args:当前方法用到的参数
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//真实对象方法执行的前置操作
args[0] = Double.parseDouble(args[0]+"")/2;
//执行真实对象中的方法
Object o = method.invoke(kw, args); //invoke方法中的参数1:代表method方法所在的对象 参数2:方法中的参数 返回值是真实方法的返回值
//后置操作
System.out.println("aaaaaaaaaa");
return o;
}
});
//执行方法
wp.throwEye(10);
//wp.dosomething();
}
}