架構核心知識-反射,動态代理
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();
}
}