一:我们要代理的类必须是实现了某一个借口,这里,我自定义一个类实现系统的Runnable借口
package com.sunsheng.tmp;
public class RunnableImpl implements Runnable {
@Override
public void run() {
System.out.println("我要睡觉,时间是5秒");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
二:要写一个类实现InvocationHandler借口,复写invoke方法,
package com.sunsheng.tmp;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class HandlerImpl implements InvocationHandler {
//定义一个成员变量,通过构造函数给他赋值
//这个变量定义成Object类型,以实现这个handler能代理任意类
//实现相同的功能
private Object target;
public HandlerImpl(Object target) {
super();
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("代理方法前插入的操作");
//执行被代理的类方法
Object result = method.invoke(target, args);
System.out.println("代理方法执行完成后的操作");
//返回被代理类方法执行的返回值
return result;
}
}
三:调用Proxy的静态方法,执行方法
package com.sunsheng.tmp;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) {
test();
}
public static void test() {
// 创建要代理类的对象
Runnable target = new RunnableImpl();
// 吃俭一个handler把被代理类的对象作为初始化参数
InvocationHandler h = new HandlerImpl(target);
// 调用Proxy的静态方法newProxyInstance方法,动态代理target这个类
Runnable ra = (Runnable) Proxy.newProxyInstance(null,
new Class[] { Runnable.class }, h);
// 调用被代理类借口的方法
ra.run();
}
}