前面讲了静态代理开发模式,因为我们了解了反射,完成可以通过反射机制实现动态代理
需求:老师与学生都有工作,而学生的工作是学习,老师的工作是教书。而需求是需要记录开始工作与结束工作,那么他们有共同点,用传统方式实现代理需要写两个代理类,而动态代理则不需要。只需要一个动态代理就能完成。
1.先定义一个接口
interface subject{
public void working();
}
2.准备两个类来继承接口
class stu implements subject{
private String name;
private int age;
public stu() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public void working() {
System.out.println("------学习----");
}
}
class tea implements subject{
private String name;
private int age;
public tea() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public void working() {
System.out.println("-------授课中------");
}
}
3.创建一个代理类
class createpoxy implements InvocationHandler {
private Object target;//需要代理的对象
//--------------创建代理方法
public Object create(Object target){
this.target=target;
Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
return proxy;
}
//--------------执行实际代理操作
@Override
public Object invoke(Object proxy, Method method, Object[] objects) throws Throwable {
System.out.println("------开始工作-------");
method.invoke(target,objects);
System.out.println("------结束工作-------");
return null;
}
}
4.调用示例
public static void main(String[] args) {
createpoxy cp= new createpoxy();//创建代理
subject s=new stu();//代理对象
subject poxy=(subject) cp.create(s);//加载代理
poxy.working();//执行代理
System.out.println("------------------");
createpoxy cp2=new createpoxy();
subject t=new tea();
subject pox=(subject) cp2.create(t);
pox.working();
}
结果
------开始工作-------
------学习----
------结束工作-------
-----------
------开始工作-------
-------授课中------
------结束工作-------