目录
产生一新的代理类,重写需要添加代理的方法,{引用旧方法+代理方法}
一、 代理模式
代码:
Speakable接口:
package daili;
/**
* @author: y9
* @Date: 2021/10/01
*/
public interface Speakable {
public void speak(String msg);
}
Person类:
package daili;
/**
* @author: y9
* @Date: 2021/10/01
*/
public class Person implements Speakable{
@Override
public void speak(String msg) {
System.out.println("Speak: " + msg);
}
}
代理类:
package daili;
/**
* @author: y9
* @Date: 2021/10/01
*/
public class PersonProxy implements Speakable{
private Person person;
public PersonProxy(Person person) {
this.person = person;
}
@Override
public void speak(String msg) {
this.person.speak(msg);
System.out.println("运行时间:" + System.currentTimeMillis()); //代理内容,输出运行时间
}
}
测试类:
package daili;
/**
* @author: y9
* @Date: 2021/10/01
*/
public class Bootstrap {
public static void main(String[] args) {
Person person = new Person();
PersonProxy proxy = new PersonProxy(person); //添加代理语句
proxy.speak("Lesson one!");
}
}
测试结果:
Speak: Lesson one!
运行时间:1633046961346
核心思想:
产生一新的代理类,重写需要添加代理的方法,{引用旧方法+代理方法}
二、 动态代理
代码:
代理类:
package daili;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @author: y9
* @Date: 2021/10/01
*/
public class MyProxy implements InvocationHandler{ //调用处理器接口
private Object proxied;
public MyProxy(Object proxied) {
this.proxied = proxied;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
method.invoke(this.proxied, args);
System.out.println("运行时间:"+System.currentTimeMillis());
return null;
}
}
测试类:
package daili;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
* @author: y9
* @Date: 2021/10/01
*/
public class Bootstrap {
public static void main(String[] args) {
Person person = new Person();
/*代理方法
* public static Object newProxyInstance(ClassLoader loader,
* Class<?>[] interfaces,
* InvocationHandler h) */
Speakable speakable = (Speakable)Proxy.newProxyInstance
(Speakable.class.getClassLoader(),
new Class[] {Speakable.class},
new MyProxy(person));
speakable.speak("Lesson two!");
}
}
结果:
Speak: Lesson two!
运行时间:1633048153685
核心代码:
/*代理方法
* public static Object newProxyInstance(ClassLoader loader,
* Class<?>[] interfaces,
* InvocationHandler h) */
Speakable speakable = (Speakable)Proxy.newProxyInstance
(Speakable.class.getClassLoader(),
new Class[] {Speakable.class},
new MyProxy(person));