Java之动态代理
文章目录
Java之动态代理基本说明例子代码接口`LinuxService`实现类`LinuxServiceImpl`想要代理接口的代理对象执行类结果
基本说明
我们的目标是:在不改变目标对象方法的情况下对方法进行增强!
动态代理类的字节码在程序运行时由Java反射机制动态生成,而无需手动编写它的源代码。
简化了编程工作提高了软件系统的可扩展性
Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。
例子
目标:现在有一个linux命令的接口LinuxService,接口中有个方法是创建目录的方法mkdir,想在创建目录的时候能指定一个目标路径。但是不改变LinuxService中的方法。方案:使用动态代理,在使用LinuxService接口中的mkdir时,代理对象指定目录,但在调用方看来,使用的就是LinuxService类的实例中的mkdir方法。
代码
接口LinuxService
public interface LinuxService {
void mkdir();
void touch();
void vim();
void cat();
}
实现类LinuxServiceImpl
public class LinuxServiceImpl implements LinuxService {
private static String centreMessage
= "我的核心实现是:";
@Override
public void mkdir() {
System
.out
.println(centreMessage
+"创建一个文件夹!");
}
@Override
public void touch() {
System
.out
.println(centreMessage
+"创建一个用来编辑的文件!");
}
@Override
public void vim() {
System
.out
.println(centreMessage
+"打开上面的文件并编辑!");
}
@Override
public void cat() {
System
.out
.println(centreMessage
+"查看编辑过后的文件!");
}
}
想要代理接口的代理对象
public class LinuxServiceProxy implements InvocationHandler {
private Object target
;
public LinuxServiceProxy(Object target
){
this.target
= target
;
}
@Override
public Object
invoke(Object proxy
, Method method
, Object
[] args
) throws Throwable
{
System
.out
.println("=======代理对象开始工作========");
System
.out
.println("进入/Users/mac/Documents目录下后,创建一个新目录test,之后在/test中创建文件以及编辑文件!");
Object result
=method
.invoke(target
, args
);
System
.out
.println("=======执行结束后跟我说一下========");
return result
;
}
}
执行类
public class TestLinuxProxy {
public static void main(String
[] args
) {
LinuxService linuxService
= new LinuxServiceImpl();
LinuxServiceProxy linuxServiceProxy
= new LinuxServiceProxy(linuxService
);
LinuxService asr
= (LinuxService
) Proxy
.newProxyInstance(linuxService
.getClass().getClassLoader(),
linuxService
.getClass().getInterfaces(),
linuxServiceProxy
);
asr
.mkdir();
}
}
结果
=======代理对象开始工作========
进入/Users/mac/Documents目录下后,创建一个新目录test,之后在/test中创建文件以及编辑文件!
我的核心实现是:创建一个文件夹!
=======执行结束后跟我说一下========