java 反射和動態代理
1:理解Class類及瞭解其常用的方法
方法名 | 功能說明 |
static Class forName(String name) | 返回指定類名 name 的 Class 物件 |
Object newInstance() | 呼叫預設建構函式,返回該Class物件的一個例項 |
getName() | 返回此Class物件所表示的實體(類、介面、陣列類、基本型別 或void)名稱 |
Class getSuperClass() | 返回當前Class物件的父類的Class物件 |
Class [] getInterfaces() | 獲取當前Class物件的介面 |
ClassLoader getClassLoader() | 返回該類的類載入器 |
Class getSuperclass() | 返回表示此Class所表示的實體的超類的Class |
Constructor[] getConstructors() | 返回一個包含某些Constructor物件的陣列 |
Field[] getDeclaredFields() | 返回Field物件的一個陣列 |
Method getMethod(String name,Class … paramTypes) | 返回一個Method物件,此物件的形參型別為paramType |
2獲取Class的幾種常用方法:
假如有一個類 在 com.test.entity 這個包下面有一個Student物件
《1》:Class<Student> stu = Student.class;
《2》:Student stu=new Student();
Class<Student> stu =stu.getClass();
《3》:Class stu = Class.forName(“com.test.entity.Student”);
3類的載入器讀取配置檔案
Properties用來讀取配置檔案
Properties pros = new Properties();
《--------------------------------------------------兩種讀取方式---------------------------------------------------------------》
用流方式讀取
FileInputStream fis = new FileInputStream("jdbc.properties");
用類載入器讀取
ClassLoader classLoader = 當前物件名.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("jdbc.properties");
《-------------------------------------------兩種讀取方式結束----------------------------------------------------------------------》
pros.load(fis);
根據配檔案的key獲取值
pros.getProperty("user");
動態代理是反射的一種應用
動態代理實現思路和核心程式碼
1:代理物件和被代理物件必須實現同一套介面 我們需要定義介面
2:建立被代理物件實現定義好的介面
3:呼叫reflect API 獲取代理物件
4:實現當通過代理類的物件呼叫方法a時,動態的去呼叫被代理類中的同名方法a;
程式碼舉例:
interface Human{
String getBelief();
void eat(String food);
}
//被代理類
class SuperMan implements Human{
@Override
public String getBelief() {
return "I believe I can fly!";
}
@Override
public void eat(String food) {
System.out.println("我喜歡吃" + food);
}
}
/*
要想實現動態代理,需要解決的問題?
問題一:如何根據載入到記憶體中的被代理類,動態的建立一個代理類及其物件。
問題二:當通過代理類的物件呼叫方法a時,如何動態的去呼叫被代理類中的同名方法a。
*/
class ProxyFactory{
//呼叫此方法,返回一個代理類的物件。解決問題一
public static Object getProxyInstance(Object obj){//obj:被代理類的物件
MyInvocationHandler handler = new MyInvocationHandler();
handler.bind(obj);
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler);
}
}
class MyInvocationHandler implements InvocationHandler{
private Object obj;//需要使用被代理類的物件進行賦值
public void bind(Object obj){
this.obj = obj;
}
//當我們通過代理類的物件,呼叫方法a時,就會自動的呼叫如下的方法:invoke()
//將被代理類要執行的方法a的功能就宣告在invoke()中
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//method:即為代理類物件呼叫的方法,此方法也就作為了被代理類物件要呼叫的方法
//obj:被代理類的物件
Object returnValue = method.invoke(obj,args);
//上述方法的返回值就作為當前類中的invoke()的返回值。
return returnValue;
}
}
呼叫舉例
SuperMan superMan = new SuperMan();
//proxyInstance:代理類的物件
Human proxyInstance = (Human) ProxyFactory.getProxyInstance(superMan);
//當通過代理類物件呼叫方法時,會自動的呼叫被代理類中同名的方法
String belief = proxyInstance.getBelief();
System.out.println(belief);
proxyInstance.eat("餃子");
System.out.println("*****************************");
相關文章
- Java動態代理和反射機制Java反射
- 深入理解 Java 反射和動態代理Java反射
- 【譯】11. Java反射——動態代理Java反射
- java靜態代理和動態代理Java
- 死磕java底層(三)—反射、動態代理和註解Java反射
- 深入淺出MyBatis:反射和動態代理MyBatis反射
- 反射-動態代理的概述和實現反射
- Java代理(jdk靜態代理、動態代理和cglib動態代理)JavaJDKCGLib
- java反射之動態代理學習筆記Java反射筆記
- Java提高班(六)反射和動態代理(JDK Proxy和Cglib)Java反射JDKCGLib
- PHP 反射之動態代理PHP反射
- Java中的靜態代理和動態代理Java
- Java基礎系列-靜態代理和動態代理Java
- java執行原理、靜態代理和動態代理區分Java
- 靜態代理和動態代理
- java動態代理Java
- Java動態代理(JDK和cglib)JavaJDKCGLib
- 【JAVA】代理模式之Java動態代理Java模式
- Java 靜態代理和動態代理的使用及原理解析Java
- java動態代理動態在哪裡?Java
- Java動態代理(AOP)Java
- java動態代理(1)Java
- java 的動態代理Java
- Java Proxy動態代理Java
- java動態代理原理Java
- 輕鬆理解 Java 靜態代理/動態代理Java
- Java動態程式設計---動態代理Java程式設計
- Java進階--Java動態代理Java
- SAP ABAP和Java的動態代理實現Java
- Java使用Porxy和InvocationHandler實現動態代理Java
- guava反射:Reflection.newProxy方法簡化動態代理Guava反射
- JAVA學習篇--靜態代理VS動態代理Java
- Java 動態代理newProxyInstanceJava
- 動態代理及java演示Java
- java動態代理如何使用Java
- Java 動態代理深入解析Java
- Java Web之動態代理JavaWeb
- (轉)Java動態代理與CGLib代理JavaCGLib