先說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");