1.动态代理的作用:
可以报一些相同的内容抽取出来做成一个代理,然后让不同的内容让真实类去执行。
注:这里的真实类是相对于代理对象。两个操作的内容不同。
2.动态代理操作:
将不同的内容抽取成接口,创建一个类去实现这些接口,这个实现的类就是真实类。
例子:
public interface UserService {
// 注册
public abstract void register(String name, String password);
// 登录
public abstract void login(String name, String password);
// 查询所有用户
public abstract void showUsers();
}
注:这里将需要操作的内容抽取成接口
创建一个类去实现接口作为真实类:
public class UserServiceImpl implements UserService {
// 注册
@Override
public void register(String name, String password) {
try {
Thread.sleep(888);
} catch (InterruptedException e) {}
System.out.println("模拟注册功能!" + name + " : " + password);
}
// 登录
@Override
public void login(String name, String password) {
try {
Thread.sleep(1888);
} catch (InterruptedException e) {}
System.out.println("模拟登录功能!" + name + " : " + password);
}
// 查询所有用户
@Override
public void showUsers() {
try {
Thread.sleep(2888);
} catch (InterruptedException e) {}
System.out.println("模拟查询所有用户功能!");
}
}
说明:这里使用休眠来模拟各个功能所需要的耗时。
创建一个测试类:
public static void main(String[] args) {
//创建真实类
UserServiceImpl userService = new UserServiceImpl();
//创建代理对象
UserService proxy = (UserService)Proxy.newProxyInstance(//将object强转为真实类
Demo06.class.getClassLoader(),//类加载器
new Class[]{UserService.class},//接口类等待代理去实现
new InvocationHandler() {//处理器接口,放匿名内部类
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
long start = System.currentTimeMillis();
//类调用执行,里面传入真实要实现的类,以及参数
Object invoke = method.invoke(userService, args);
long end = System.currentTimeMillis();
System.out.println(method.getName()+"运行时间为:"+(end - start));
return invoke;
}
}
);
proxy.login("admin","pass123");
proxy.register("admin","pass123");
proxy.showUsers();
}
部分代码说明:
Proxy(代理):来自于java的反射包通过Proxy的静态方法获取一个代理对像Proxy.newProxyInstance
static Object newProxyInstance(ClassLoader loader, Class>[] interfaces, InvocationHandler h) 返回指定接口的代理实例,该代理实例将方法调用分派给指定的调用处理程序。
参数说明: ClassLoader loader 类加载器对象:通过类名.Class获取类的反射对象再通过getClassLoader()方法获取类的加载器对象。
Class>[] interfaces 接口类:接口等待去实现,数组可以有多个接口类。(但可以定一个父类去将所有子类接口合为一起)
InvocationHandler h 处理器接口,放匿名内部类



