1、定义一个接口
2、创建个类实现该接口,用于被代理
3、创建一个代理类,调用
Proxy.newProxyInstance(目标类的类加载器,目标类实现的接口,new InvocationHandler(){@Override
//invoke(代理类对象(不用动),要执行的方法(不用动),要执行的方法实参(不用动))
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {return null;})
被代理的类:
public class BigStar implements Star{
@Override
public void Sing(String song) {
System.out.println("演唱了歌曲"+song);
}
@Override
public void Dance() {
System.out.println("跳了舞~");
}
}
被代理类的接口:
public interface Star {
void Sing(String song);
void Dance();
}
代理类:
public class ProxyBigStar{
public static Star createProxy(Star bigStar){
Star star = (Star) Proxy.newProxyInstance(ProxyBigStar.class.getClassLoader(), new Class[]{Star.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("Sing".equals(method.getName())) {
System.out.println("准备话筒");
} else if ("Dance".equals(method.getName())) {
System.out.println("准备场地");
}
return method.invoke(bigStar, args);
}
});
return star;
}
}
测试:
public class test {
public static void main(String[] args) {
BigStar bigStar = new BigStar();
//创建代理对象
Star proxyStar = ProxyBigStar.createProxy(bigStar);
//执行代理的方法,会调用代理类的InvocationHandler匿名内部类的invoke方法,invoke方法对调用被代理类的方法
proxyStar.Dance();
proxyStar.Sing("好久不见");
}
}
另一种实现方式:
public class Proxy implements InvocationHandler {
private Object target;
public Proxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("即将调用run");
method.invoke(target,args);
System.out.println("run执行完毕");
return null;
}
public Object createProxy(){
Object o = java.lang.reflect.Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
return o;
}
}