前言
由于前面静态代理暴露出一个问题,就是当需要代理的对象越来越多怎么办?于是就有了动态代理。
1.我们首先需要修改Agent.java:
- 必须实现invocationHandler接口
package com.wei;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Agent implements InvocationHandler{
private Object target; //创建万能对象
public Object getTarget() {
return target;
}
public void setTarget(Object target) { //通过set将被代理的真实对象设置进来
this.target = target;
}
public Object getProxyInstance() { //调用此方法实现代动态理
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
void init() {
System.out.println("唱歌开始。。。");
}
void distory() {
System.out.println("唱歌结束。。。");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object = null;
init(); //方法增强
object = method.invoke(target,args);
distory(); //方法增强
return null;
}
}
2.修改Client代码:
package com.wei;
public class Client {
public static void main(String[] args) {
Girl realGirl = new RealGirl(); //创建RealGirl
Agent agent = new Agent(); //创建代理公司
agent.setTarget(realGirl); //设置对象
Girl one = (Girl)agent.getProxyInstance(); //调用方法实现动态代理
one.sing(); //测试代理
}
}
3.附上Girl接口代码和RealGirl实现类的代码:
- Girl.java
package com.wei;
public interface Girl {
void sing();
}
- RealGirl.java
package com.wei;
public class RealGirl implements Girl {
@Override
public void sing() {
System.out.println("RealGirl开始唱歌。。。");
}
}
4.最后运行代码:
- 成功运行,这样就可以传任意对象进来,动态代理就可以实现代理。