Animal接口類
package cn.itheima.dynamic_static;
public interface Animal {
void eat();
void sleep();
}
Person接口類
package cn.itheima.dynamic_static;
public interface Person {
void think();
void speek();
}
Animal的實作類dog
package cn.itheima.dynamic_static;
public class Dog implements Animal {
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("狗在吃");
}
@Override
public void sleep() {
// TODO Auto-generated method stub
System.out.println("狗在睡");
}
}
Person的實作類Student
package cn.itheima.dynamic_static;
public class Student implements Person {
@Override
public void think() {
// TODO Auto-generated method stub
System.out.println("學生在思考");
}
@Override
public void speek() {
// TODO Auto-generated method stub
System.out.println("學生在講話");
}
}
靜态代理學生類
package cn.itheima.dynamic_static;
public class StaticStudent implements Person {
Student student = new Student();
@Override
public void think() {
// TODO Auto-generated method stub
System.out.println("人在認真");
student.think();
}
@Override
public void speek() {
// TODO Auto-generated method stub
System.out.println("人在認真");
student.speek();
}
}
靜态代理增強dog類
package cn.itheima.dynamic_static;
public class StaticDog implements Animal,Person {
Dog dog = new Dog();
Student student = new Student();
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("狗在努力");
dog.eat();
}
@Override
public void sleep() {
// TODO Auto-generated method stub
System.out.println("狗在繼續努力");
dog.sleep();
}
@Override
public void think() {
// TODO Auto-generated method stub
System.out.println("人在認真");
student.think();
}
@Override
public void speek() {
// TODO Auto-generated method stub
System.out.println("人在認真");
student.speek();
}
}
動态代理dog類
package cn.itheima.dynamic_static;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicDog implements InvocationHandler {
Dog dog = new Dog();
public Animal getProxy() {
Animal dogProxy = (Animal) Proxy.newProxyInstance(dog.getClass().getClassLoader(), dog.getClass().getInterfaces(), this);
return dogProxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("狗在努力");
method.invoke(dog, null);
return null;
}
}
demo測試類
package cn.itheima.dynamic_static;
public class Demo {
public static void main(String[] args) {
StaticDog staticdog = new StaticDog();
Dog dog = new Dog();
dog.eat();
dog.sleep();
System.out.println("靜态代理之後-------------------");
staticdog.eat();
staticdog.sleep();
System.out.println("學生的靜态代理,多個代理類-------------");
StaticStudent ss = new StaticStudent();
ss.think();
ss.speek();
System.out.println("學生的靜态代理,使用同一個代理類-------------");
staticdog.speek();
staticdog.think();
System.out.println("測試動态代理狗===============");
DynamicDog dogProxy = new DynamicDog();
Animal proxy = dogProxy.getProxy();
proxy.eat();
proxy.sleep();
}
}
結論:要對多個類進行增強,動态代理必須再建立一個新的代理類,靜态代理可以都在一個類中完成,
要對類中的方法進行個性化增強,靜态代理可以做到,動态代理不能做到
靜态代理效率高,代碼備援
動态代理少些代理,能用很少的代碼對一個類的所有方法實作一樣的增強效果,但是不能獨立增強一個方法
靜态代理,目标接口增加了方法,靜态代理會受到影響
動态代理則不會