JAVA反射的認識

先說Class對象的幾種獲取方式 (推薦使用第三種方式,依賴性較小

通過實例對象獲取

 LoginService loginService=new LoginService();
   Class<?> loginServiceClass=loginService.getClass();

通過類名獲得

 Class<?> loginServiceClass1=LoginService.class;

通過Class的靜態方法獲得

 Class<?> loginServiceClass2=Class.forName("com.xxl.job.admin.service.LoginService");

 

然後說基於class對象的反射的應用

1.通過反射動態獲取類實例對象(工廠模式中可以用來動態獲取同一接口不同的實現類實例)

通過類對象的newInstance()可以獲得類的實例對象;

 Class<?> loginServiceClass2=Class.forName("com.xxl.job.admin.service.LoginService");
 LoginService loginService=(LoginService)loginServiceClass.newInstance();

2.通過反射獲取並調用類的方法

通過類對象的getMethod()可以得到對象的方法對象,這個方法的參數是方法名和方法的參數的類型;

通過Method對象的invoke()方法可以執行這個方法,這個方法的參數是目標實例對象和方法參數(可有可無)

LoginService loginService1=(LoginService)loginServiceClass.newInstance();
//login方法,這個方法有兩個string類型的參數
Method login=loginServiceClass.getMethod("login",String.class, String.class);
login.invoke(loginService1,"userName","passWord");
//toString方法,這個方法沒有參數,有返回值
Method toString=loginServiceClass.getMethod("toString");
Object result=toString.invoke(loginService1);

3.通過反射獲取,設置類屬性的值(類似於get,set方法)

        Class<?> loginServiceClass2=Class.forName("com.xxl.job.admin.service.LoginService");

        LoginService loginService1=(LoginService)loginServiceClass.newInstance();
        //獲取私有屬性字段 key
        Field field=loginServiceClass2.getDeclaredField("key");
        //設置私有字段訪問權限
        field.setAccessible(true);
        //爲私有字段 key賦值爲123
        field.set(loginService1,"123");

 

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