反射(Reflection)是java語言的一個特性锣杂,它允程序在運行時來進行自我檢查并且對內部的成員進行操作。一個常見的例子是在JavaBean中洞坑,一些組件可以通過一個構造器來操作耳高。這個構造器就是用的反射在動態(tài)加載的時候來獲取的java中類的屬性的。
反射相關的包
java.lang.reflect
java.lang.Class(反射的開始)
通過反射了解類
給定一個類或者對象蕊爵,通過反射機制可以動態(tài)的
了解類的屬性,方法桦山,構造函數
創(chuàng)建對象
調用方法
改寫屬性
應用場景
運行時攒射,動態(tài)的情況下應對外面?zhèn)魅氲念惷瑢ο髮嵗?br>
只知道類名字符串
通常應用到框架中
反射的開始:類類型 Class Class
java中有一個類很特殊恒水,就是Class類会放,這個類是有JVM來創(chuàng)建的,所以我們就不用麻煩了钉凌。如果我們拿到一個類的類型信息咧最,就可以利用反射獲取其各種成員以及方法了。
在沒有對象實例的時候,主要有三種辦法矢沿。
System.out.println("Method 1:"); //通過一個實例來獲得
class Class dog=new Dog().getClass();
System.out.println(dog.getName());
System.out.println("Method 2:"); //通過className來獲得
Class c=Class.forName(className);
System.out.println("Method 3:"); //通過已知的類獲取class
Class b=Dog.class;
注意:第二種方式中滥搭,forName中的參數一定是完整的類名(包名+類名)咨察,并且這個方法需要捕獲異常论熙。
現(xiàn)在得到Class就可以創(chuàng)建一個對象的實例了福青,利用Class的newInstance方法相當于調用類的默認的構造器摄狱。
//方法一 :調用類的空構造方法
Object o=dogClazz.newInstance();
System.out.println("創(chuàng)建的對象是:");
System.out.println(o);
//方法二 :使用有參數的構造方法:Constructor類,這個類用來封裝反射得到的構造器
Constructor c=dogClazz.getConstructor(new Class[]{String.class,int.class});
Object o2=c.newInstance("大黃",5);
獲取類的成員變量
成員變量用Field類進行封裝无午,主要的方法非常的類似:
public [Field] getDeclaredField([String]) 獲取任意指定名字的成員
public [Field][] getDeclaredFields() 獲取所有的成員變量
public [Field] getField([String] name) 獲取任意public成員變量
public [Field][] getFields() 獲取所有的public成員變量
注意媒役,以上的四個方法全部需要拋出異常,當我們獲得私有的方法的時候宪迟,要用setAccessible設置一下可訪問的權限酣衷。
Object o = dogClazz.newInstance();
System.out.println("通過空的構造函數創(chuàng)建的對象是"+ o);
Field[] fields=dogClazz.getFields();
for(Field f:fields){
System.out.println(f.getName());
}
Field f = dogClazz.getField("name");
f.set(o, "hisdog");
f.get(o);
獲取類的方法
封裝類的方法的類是Method.獲取method也有四個方法
public [Method][] getMethods() 獲取所有的共有方法的集合
**public [Method] getMethod([String] name,[Class]<?>... parameterTypes) 獲取指定公有方法 參數1:方法名 參數2:參數類型集合 **
public [Method][] getDeclaredMethods() 獲取所有的方法
public [Method] getDeclaredMethod([String] name,[Class]<?>... parameterTypes) 獲取任意指定方法
Object o = dogClazz.newInstance();
System.out.println("通過空的構造函數創(chuàng)建的對象是"+ o);
Method m=dogClazz.getMethod("bark", new Class[]{});
m.invoke(o, new Object[]{});
注意:在獲取類和成員變量時若含有Declared的方法,是獲得自定義的目標