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();
}
}
结论:要对多个类进行增强,动态代理必须再创建一个新的代理类,静态代理可以都在一个类中完成,
要对类中的方法进行个性化增强,静态代理可以做到,动态代理不能做到
静态代理效率高,代码冗余
动态代理少些代理,能用很少的代码对一个类的所有方法实现一样的增强效果,但是不能独立增强一个方法
静态代理,目标接口增加了方法,静态代理会受到影响
动态代理则不会