学习SpringAOP,看了一些书和网上的课程,基本上都是从什么切点、切面、连接点等来论述AOP的应用,感觉一开始面对这些,不是怎么好理解。要想全面的理解AOP,笔者认为,从其底层的实现原理——动态代理和反射,来介绍,会更加清晰明确,也会更加简单一些。
废话不多说,直接先看一个反射的Demo
package com.spring.aop.reflect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectHello {
public ReflectHello() {
}
public void sayHello(String name) {
System.err.println("hello " + name);
}
public static void main(String []args) {
try {
//通过反射生成对象,相当于 ReflectHello refect = new ReflectHello();
ReflectHello refect = (ReflectHello)Class.forName("com.spring.aop.reflect.ReflectHello").newInstance();
//通过类获取方法,sayHello。
Method method = refect.getClass().getMethod("sayHello", String.class);
//相当于语句, refect.sayHello("张三")
method.invoke(refect, "张三"); }
catch (InstantiationException e) {
e.printStackTrace();
}
}
}
首先,我们通过Class.forName的形式加载了一个类的全限定名,那么JDK的类加载器就会对应的Package中去找它,用newInstance代表生成一个类的实例(如果方法有构造参数的需要另外写法)。这样便可以得到一个ReflectHello对象。然后我们通过类去获取sayHello方法,这里的getMethod方法中参数,第一个为方法名称,后面的是参数类型(可以是多个)。最后使用method.invoke方法反射,invoke方法参数,第一个是类对象,第二个是参数。这就相当于用对象调用了一次sayHello方法,只是这里使用的反射调用而已。
Java反射,就是这样。