public class MainTest {
public static void main(String[] args) {
JdkProxy jdkp = new JdkProxy();
//获取代理对象
SuperProxy sp = (SuperProxy)jdkp.bind(new SpeakVoice());
sp.speak();
sp.speakChinese();
sp.speak("王五", "18");
}
}
public interface SuperProxy {
public void speak(String name,String age);
public void speak();
public void speakChinese();
}
public class SpeakVoice implements SuperProxy{
@Override
public void speak(String name, String age) {
System.out.println("name:"+name+" age:"+age);
}
@Override
public void speak() {
System.out.println("什么也不说");
}
public void speakChinese() {
System.out.println("我会说中文");
}
}
mport java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.text.SimpleDateFormat;
import java.util.Date;
public class JdkProxy implements InvocationHandler{
//真实对象也就是目标对象或被代理对象
private Object target;
public JdkProxy() {}
public JdkProxy(Object target) {
this.target = target;
}
//绑定代理对象和真实对象的关系,
//第一个参数是代理对象使用哪个加载器,也就是被代理类的类加载器,
//第二个参数是生成那个对象的代理对象,被代理对象下挂的接口,
//第三个参数是代理类或者实现了InvocationHandler的匿名内部类。
public Object bind(Object target) {
this.target = target;
// newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
//返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。jdk1.8 api 的原
//话
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("进入代理逻辑方法");
System.out.println("调用真实方法"+
new SimpleDateFormat("yyyy-mm-dd hh:dd:ss").format(new Date()));
Object obj = null;
try {
obj = method.invoke(target, args);
System.out.println("调用真实方法完毕"+
new SimpleDateFormat("yyyy-mm-dd hh:dd:ss").format(new Date()));
}catch(Exception e) {
e.printStackTrace();
System.out.println("调用真实方法发生错误");
}
return obj;
}
}
进入代理逻辑方法
调用真实方法2019-36-16 11:16:53
什么也不说
调用真实方法完毕2019-36-16 11:16:53
进入代理逻辑方法
调用真实方法2019-36-16 11:16:53
我会说中文
调用真实方法完毕2019-36-16 11:16:53
进入代理逻辑方法
调用真实方法2019-36-16 11:16:53
name:王五 age:18
调用真实方法完毕2019-36-16 11:16:53
jdk动态代理,代理类必须实现InvocationHandler接口,实现该接口的invoke方法,然后使用ClassLoader loader, Class<?>[] interfaces, InvocationHandler h);获取代理对象。从而达到对代理对象的增强处理。