动态代理场景:你需要通过一个女孩的家庭人员的同意才可以约女孩出去
动态代理几个关键要素:
1.被代理的接口类
2.被代理接口的实现类
3.代理类,
1)需要把代理接口引入代理类中;
public class FamilyProxy implements InvocationHandler {
Girl girl;
public FamilyProxy(Girl girl) {
this.girl = girl;
}
2)代理类需要实现InvocationHandler接口,实现invoke方法,invoke方法中的参数需要传入被代理的接口类;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object invoke = method.invoke(girl,args);
after();
return invoke;
}
3)需加入代理类生成的方法Proxy.newProxyInstance生成一个代理对象,如下:
public Object getNewInstance(){
return Proxy.newProxyInstance(girl.getClass().getClassLoader(),girl.getClass().getInterfaces(),this);
}
具体实现如下:
接口类:
package com.spring.proxy;
public interface Girl {
void date();
void watchMovie();
}
实现类:
package com.spring.proxy;
public class BeatifulGirl implements Girl {
@Override
public void date() {
System.out.println("美丽女孩陪你去约会");
}
@Override
public void watchMovie() {
System.out.println("美丽女孩陪你去看电影");
}
}
代理类:
package com.spring.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class FamilyProxy implements InvocationHandler {
Girl girl;
public FamilyProxy(Girl girl) {
this.girl = girl;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object invoke = method.invoke(girl,args);
after();
return invoke;
}
public Object getNewInstance(){
return Proxy.newProxyInstance(girl.getClass().getClassLoader(),girl.getClass().getInterfaces(),this);
}
public void before(){
System.out.println("约会前的调查");
}
public void after(){
System.out.println("约会后的审问");
}
}
测试类:
package com.spring.proxy;
public class Test {
public static void main(String[] args) {
//创建目标类
Girl girl=new BeatifulGirl();
//在代理类中注入目标类
FamilyProxy familyProxy =new FamilyProxy(girl);
//获取代理类
Girl mother = (Girl) familyProxy.getNewInstance();
//通过代理类实现目标类的方法
mother.date();
System.out.println("=======================");
//通过代理类实现目标类的方法
mother.watchMovie();
}
}
运行结果:
约会前的调查
美丽女孩陪你去约会
约会后的审问
=======================
约会前的调查
美丽女孩陪你去看电影
约会后的审问