天天看點

Spring核心原理AOP

架構核心知識-反射,動态代理

1、動态語言,具備反射機制

a、運作時,判斷任意一個對象所屬類

b、構造任意一個類的對象執行個體

c、判斷任意類所具備的成員變量和方法

d、調用任意類所具備的成員變量和方法

e、生成動态代理

2、java反射中,最核心的api:

java.lang.Class 代表一個類

java.lang.reflect.Method 代表類的方法

java.lang.reflect.Filed 代表類的成員變量

java.lang.reflect.Constructor 代表類的構造方法

3、Class類

正常:import導入-》通過new執行個體化-》取得執行個體化對象

反射:執行個體化對象-》getClass方法-》類的名稱

類它既能夠拿到屬性方法和構造器

例子:

public class Person{
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}           
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class aop {

    public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Object obj=new Person();
        Class clazz=obj.getClass();
        System.out.println(clazz.getName()+"----"+clazz.getSimpleName());

        try {
            Method mSet = clazz.getMethod("setName",String.class);
            try {
                mSet.invoke(obj,"12345");
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            Method mGet = clazz.getMethod("getName");
            System.out.println(mGet.invoke(obj));
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }
}
           

Class的執行個體擷取方式

1、類名.class

2、對象執行個體.getClass();

3、Class.forName()

4、classLoader.loadClass(“”)

類的加載過程

AOP Spring jdk (反射結合proxy)

動态代理,是指客戶通過代理類調用其他對象的方法,并且在程式運作時根據需要動态的建立目标類的代理對象。

package aop;
public interface Person {
    public void sayHello();
}           
package aop;

public class Student implements Person{
    private String name="jkxqj";
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public void sayHello() {
        System.out.println("大家好,我是"+name);
    }
}
           
package aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyHandler implements InvocationHandler{
    private Object obj;
    public ProxyHandler(Object obj){
        this.obj=obj;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("調用前。。。");
        Object result = method.invoke(this.obj, args);
        System.out.println("調用後。。。");
        return result;
    }

}
           
package aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class aop {
    public static void main(String[] args) {
        Person person=new Student();
        InvocationHandler handler=new ProxyHandler(person);
        Person p =(Person)Proxy.newProxyInstance(person.getClass().getClassLoader(),person.getClass().getInterfaces(), handler);
        p.sayHello();
    }
}