代理: 就是让代理角色帮助真实角色完成一件事情;
一、静态代理的特点:代
都需要实现同一个接口,真实角色专注于自己的事情; 代理角色目的就是帮助真实角色完成一件事情.
多线程的实现方式2:实现一个接口Runnable 使用的就是"静态代理"的思想
1)自定义一个类MyRunnable implements Runable{} ,重写接口run方法
2)Thread类本身就是实现 Runable{}接口
class Thread implements Runnable{ //代理角色
private Runnable target;
public Thread(Runnable target) {...}
@Override
public void run() {
if (target != null) {
target.run();
}
}
}
静态代理实现:
package com.hsm;
public class Main {
public static void main(String[] args) {
HelloServiceImpl helloService = new HelloServiceImpl();
HelloServiceProxy helloServiceProxy = new HelloServiceProxy(helloService);
helloServiceProxy.hello("Panda");
helloServiceProxy.hi("Panda");
}
}
interface HelloService{
String hello(String name);
String hi(String msg);
}
class HelloServiceImpl implements HelloService{
@Override
public String hello(String name) {
return "Hello"+name;
}
@Override
public String hi(String msg) {
return "hi"+msg;
}
}
class HelloServiceProxy implements HelloService{
private HelloService helloService;
public HelloServiceProxy(HelloService helloService){
this.helloService=helloService;
}
@Override
public String hello(String name) {
System.out.println("预处理...");
String result = helloService.hello(name);
System.out.println(result);
System.out.println("后处理...");
return result;
}
@Override
public String hi(String msg) {
System.out.println("预处理...");
String result = helloService.hi(msg);
System.out.println(result);
System.out.println("后处理...");
return result;
}
}
二、动态代理
jdk动态代理:
是在程序的执行过程中,通过反射产生的代理对象!
java.lang.reflect.Proxy:用于动态生成代理类,只需传入目标接口、
目标接口的类加载器以及InvocationHandler就可生成代理类及代理对象。
java.lang.reflect.InvocationHandler:该接口包含一个invoke方法,
通过该方法实现对委托类的代理的访问。
java.lang.ClassLoader:类加载器类,负责将类的字节码装载到Java虚拟机中并为其定义类对象,
然后该类才能被使用。
jdk动态代理特点:基于接口实现的
cglib动态代理:基于类实现
动态代理步骤:
1、创建被代理的接口和类;
2、实现InvocationHandler接口,对目标接口中声明的所有方法进行统一处理;
3、调用Proxy的静态方法,创建代理类并生成相应的代理对象;
4、使用代理。