java反射的使用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章