java中的反射經常被用在一些框架搭建上,他能夠讓我們很方便的對自己未來將使用的類,方法和變量進行訪問。個人覺得有種黑客的味道在裏面。當我們知道一個類的類名後,我們基本上可以使用反射的到它的一切。包括他的private的方法和變量等(當然訪問他們的使用需要使用的是getDeclared***(**))。另外,據說反射是比較消耗性能的,故而出了框架搭建外,一般用得不多。
1.基本常用的反射使用。
Class.forName("****");這個語句是java連接數據庫的第一個語句。
2.通過構造器創建反射類實例。
首先,獲取反射類的構造器。 構造器類.class.get構造器等方法。
然後,我們再獲取構造器需要的參數類型。
最後,我們再利用newinstance方法來構建其實例。
3.利用反射來獲取一個類的方法或者屬性。
需要注意的是訪問private的方法和變量,使用需要使用的是getDeclared***(**)。變量我們還需要用.setAccessible(true).
具體實例如下:
有了如下的代碼,只要有個類名的字符串,你就可以獲得它這個類的一切東西,包括私有屬性和方法。
//リフレクトで、クラスのconstructorを取得し、情報も取得する。
Class reflectBeanClass = Class.forName("com.cy.ReflectBean");
Constructor[] constructors = reflectBeanClass.getConstructors();
for(Constructor cons : constructors){
//constructorのParameterTypes
Class[] parClasses = cons.getParameterTypes();
int paramLen = parClasses.length;
if(parClasses != null && paramLen > 0){
for(Class parClass : parClasses){
System.out.println(parClass.getName());
}
}
Object objectClass = null;
switch(paramLen){
case 0 :
objectClass = cons.newInstance(null);
System.out.println("test2 : "+((ReflectBean)objectClass).test2);
//private屬性の取得と設定
Field field = objectClass.getClass().getDeclaredField("intValue1");
field.setAccessible(true);
System.out.println("name : "+field.getName());
System.out.println("value : "+field.getInt(objectClass));
field.set(objectClass,999);
System.out.println("updated value : "+field.getInt(objectClass));
break;
case 1 :
//リフレクトで、変數変化可能のメソッドを利用する。
Object[] objectParam = {"陳飛"};
Class[] pramTypeArray = {int.class,int[].class};
Object[] paramValueArray = {2,new int[]{3,5,6}};
objectClass = cons.newInstance(objectParam);
Method fucMethod = objectClass.getClass().getMethod("fuc",pramTypeArray);
fucMethod.invoke(objectClass,paramValueArray);
break;
}
}