初入动态代理技术
1.简介
AOP底层原理就是动态代理技术 。为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。假设有一A对象,对A代理后,A的事情就由A的代理B来完成。
2.与反射关系
动态代理类的源码是在程序运行期间,通过JVM反射等机制动态生成。
3.实现
首先写个接口
public interface UserService {
void login ();
@Performance //仅实现对getUserList的totalTime()
void getUserList();
}
对接口类的实现
public class UserServerImpl implements UserService{
@Override
public void login() {
// TODO Auto-generated method stub
System.out.println("调用login");
System.out.println("调用login");
System.out.println("调用login");
}
public void getUserList() {
System.out.println("调用getUserList");
System.out.println("调用getUserList");
System.out.println("调用getUserList");
}
}
代理类
public class DyProxy {
private Object toProxyObj;
//动态代理技术,生成动态代理对象
public Object getProxyObject(Object object) {
this.toProxyObj =object;
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),
new InvocationHandler()
{
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result;
if (method.isAnnotationPresent(Performance.class)) {
long startTime =new Date().getTime();
//调用原函数
result =method.invoke(toProxyObj, args);
long endTime =new Date().getTime();
long totalTime =endTime -startTime;
System.out.println("执行了"+totalTime+"ms");}
else
{
result = method.invoke(toProxyObj, args);
}
return result;
}
}); }}
测试类
public class TestAOP {
public void testTime() {
long startTime =new Date().getTime();
long endTime =new Date().getTime();
long totalTime =endTime -startTime;
System.out.println("执行"+totalTime+"ms");
}
public static void main(String[] args) {
//AOP是面向切面编程,测试性能,统一日志 事务管理
UserService userService=(UserService) new DyProxy().getProxyObject(new UserServerImpl());
userService.getUserList();
userService.login();
}
}
结果
4.总结
避免代码混乱。
避免代码分散。
代码重复使用,简化代码。