天天看點

動态代理和靜态代理各自的特點

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();

}

}

結論:要對多個類進行增強,動态代理必須再建立一個新的代理類,靜态代理可以都在一個類中完成,

要對類中的方法進行個性化增強,靜态代理可以做到,動态代理不能做到

靜态代理效率高,代碼備援

動态代理少些代理,能用很少的代碼對一個類的所有方法實作一樣的增強效果,但是不能獨立增強一個方法

靜态代理,目标接口增加了方法,靜态代理會受到影響

動态代理則不會

繼續閱讀