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;
}
}