關鍵在於動態,預編譯時並不進行而當運行時需要調用某個對象、方法、類等時利用該反射機制進行,該機制可獲得任何類的內部信息、對象、屬性和方法、
*運行時,判斷任何一個對象所屬的類,創造任意類的對象。獲取並調用其方法、屬性、
getMethod/getfield:只能獲取public修飾的方法和屬性
getDeclaredField/getDeclaredMetod:能獲取所有修飾權限的屬性和方法
重點內容:
理解class類並實例化Class類對象
運行時創建類對象和獲取類的完整結構
通過反射調用制定方法和屬性
動態代理
反射方式:
*1. 類名.class;
*2. 對象.getclass//通過運行時類對象,調用getclass方法,返回其運行時類
*3. Class.forname("包名--類名")
*4. ClassLoader:類加載器,用來把類裝入內存,包括兩類:啓動類加載器(bootStrap)和用戶自定義加載器.
ClassLoader classLoader = this.getClass().getClassLoader();
Class clazz =classLoader(類名);
newInstance使用:
前提條件:有無參構造器並具有權限--Object object = clazz.newInstance();
使用反射獲取類的完整結構:
1.獲取屬性field,在通過屬性field獲取其權限修飾符和類型
2.獲取Method,權限,註釋,父類方法,接口方法,
3.獲取構造器,包括父類的
4.調用獲取的方法和屬性,[private modify--setAccessible(true)]
*field.set(obj,param);
*method.invoke(obj,param)
Java中靜態代理與動態代理
爲什麼要用代理:
代理模式的作用是:爲其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個客戶不想或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。 代理模式一般涉及到的角色有: 抽象角色:聲明真實對象和代理對象的共同接口; 代理角色:代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的接口以便在任何時刻都能代替真實對象。同時,代理對象可以在執行真實對象操作時,附加其他的操作,相當於對真實對象進行封裝。
<span style="background-color: rgb(51, 102, 255);"> * 靜態代理</span>
/*代理三要素:接口,實現接口的代理類和被代理類
**/
//*******interface
interface Book{
public void productBook();
}
//*****實現接口的被代理類
class BioBook implements Book{
@Override
public void productBook() {
System.out.println("學了生物,窮途末路");
}
}
//******實現接口的代理類
class ProxyBook implements Book{
Book book;
//將被代理類對象引入到代理類
public ProxyBook(Book book) {
super();
this.book = book;
}
@Override
public void productBook() {
System.out.println("我是代理,只管制書");
//被代理方法通過被代理對象進行調用
book.productBook();
}
}
//*********測試程序
public class StaticProxyTest{
public static void main(String[] args){
BioBook bb=new BioBook();//獲取被代理對象
ProxyBook pb=new ProxyBook(bb);//傳入代理類
pb.productBook();//在代理類裏面進行生產
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
<span style="background-color: rgb(102, 102, 204);">
動態代理</span>
/*Java代理的三要素:接口,實現接口的被代理類,實現接口的代理類
* **/
//*******interface
interface Book{
public void productBook();
}
//*****實現接口的被代理類
class BioBook implements Book{
@Override
public void productBook() {
System.out.println("學了生物,窮途末路");
}
}
//******動態代理類
class MyInvolcationHandler implements InvocationHandler{
Object obj ;
//將被代理類對象引入代理類
public Object replaceObj(Object obj){
this.obj= obj;
return Proxy.newProxyInstance(this.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}
//當通過代理類對象對重寫方法進行調用時,都會自動轉換爲對如下invoke()方法調用
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("調用了invoke方法");
//method()返回值是returnvalue
Object returnValue= method.invoke(obj, args);
return returnValue;
}
}
public class DynamicProxyTest {
public static void main(String[] args){
BioBook bb=new BioBook();//獲取被代理對象
MyInvolcationHandler myh=new MyInvolcationHandler();
Object obj = myh.replaceObj(bb);
Book book =(Book) obj;//已知obj爲Book類型,可以強轉,否則無法調用方法
book.productBook();
}
}