追妹纸所隐藏的JDK动态代理
又是一年一度学妹报名时, 化工系的冬冬难以按捺心中的欲火, 可惜理工男不懂的文采遂找一高手代劳, 写一篇文采飞扬的情书(似乎过时了,只是想说明下jdk的动态代理)
java中的代理分成JDK代理和CGLIB代理, CGLIB代理是基于类的代理(还没研究过), JDK动态代理是基于接口的代理,
JDK代理基于一个类和一个接口
Proxy类的静态方法: newProxyInstance
还有个InvocationHandler接口
下面就用java代码模拟这个过程
创建一个接口Person.java
package proxy;
/**
* 青春年少
* @author YanD
*
*/
public interface Person {
/**
* 写情书方法
*/
public void writeLoveTip();
}
package proxy;
/**
* 青春年少
* @author YanD
*
*/
public class Dongdong implements Person {
public void writeLoveTip() {
System.out.println("dongdong在抄写情书...勿扰~");
}
}
创建一个高手类作为Dongdong的代理
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 青春年少
* @author YanD
*
*/
public class WriteLoveTipProxy {
//选择要代理的对象
private Person dd = new Dongdong();
public Object getProxy()
{
return Proxy.newProxyInstance(dd.getClass().getClassLoader(), dd.getClass().getInterfaces()
,new InvocationHandler(){
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
/**
* 此为元曲, 作者曹雪芹 有兴趣的小伙伴可以百度, <<红豆词>> 很凄美的一首曲
* 遮不住的青山隐隐
* 流不断的绿水悠悠...
*/
System.out.println("滴不尽相思泪血抛红豆,");
System.out.println("开不完春柳春花满画楼...");
Object obj = method.invoke(dd, args);
return obj;
}
});
}
}
测试类Test.java
package proxy;
/**
* 青春年少
* @author YanD
*
*/
public class Test {
public static void main(String[] args) {
Person dd = (Person)new WriteLoveTipProxy().getProxy();
dd.writeLoveTip();
}
}
运行程序控制条输出:
滴不尽相思泪血抛红豆,
开不完春柳春花满画楼...
dongdong在抄写情书...勿扰~
开不完春柳春花满画楼...
dongdong在抄写情书...勿扰~
一个JDK的代理的简单实现, 理解了没?
何为编程,只不过是对自然世界的模拟罢了
ps : 我的微信号,欢迎懂技术的一起过来讨论 注明csdn上看到的