该懂的反射小操作
該懂的反射小操作
相關系列
java 的反射機制
文章目錄
- 該懂的反射小操作
- 相關系列
- 前言
- 代碼:
- 實體類
- 測試類
- つづく
前言
這里就不說哪些沒用的了,直接干貨,帶你秒懂動態操作
代碼:
實體類
public class User {public int userid;private String userName;private String password;public int getUserid() {return userid;}public void setUserid(int userid) {this.userid = userid;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public User(int userid, String userName, String password) {super();this.userid = userid;this.userName = userName;this.password = password;}public User() {super();}}測試類
Test2
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;public class Test2 {public static void main(String[] args) throws Exception {String pathString = "com.bjsxt.pojo.User"; // 獲取類的名稱Class class1 = Class.forName(pathString);System.out.println("類的全名稱:"+class1.getName());System.out.println("類的名稱:"+class1.getSimpleName());System.out.println("--------------------------------------------");// 獲取父類的Class對象Class class2 = class1.getSuperclass();System.out.println(class2.getName());System.out.println(class2.getSimpleName());System.out.println("--------------------------------------------");// 獲取類的屬性Field field = class1.getField("userid");//獲取單個屬性,只能獲取公共的屬性System.out.println(field);Field[] fields = class1.getFields();//獲取所有公共屬性;System.out.println(fields.length);Field[] fields2 = class1.getDeclaredFields();//獲取所有的屬性;System.out.println(fields2.length);for(Field field2 : fields2) {System.out.println(field2);//調用了toString方法}System.out.println();for(Field field2 : fields2) {//獲取屬性的每個部分的信息System.out.println(field2.getModifiers()+"\t"+field2.getType()+"\t"+field2.getName());}System.out.println("---------------------------------------------------");// 獲取類的方法信息Method[] methods = class1.getDeclaredMethods();System.out.println(methods.length);for(Method method : methods) {System.out.println(method);}System.out.println();for(Method method : methods) {//獲取屬性的每個部分的信息System.out.println("方法的權限"+method.getModifiers());System.out.println("返回值類型"+method.getReturnType());System.out.println("方法的名稱:"+method.getName()); // 獲取方法的參數Class[] methodParam = method.getParameterTypes();for(Class mp : methodParam ) {System.out.println("方法的參數類型:"+mp.getTypeName()+"\t");}System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");}// 用于私有的屬性,并且有公有的取值賦值方法以及無參構造方法這樣的類叫做JavaBean// 獲取類的構造器Constructor[] constructors = class1.getConstructors();for(Constructor constructor : constructors) {System.out.println(constructor);}// 獲取指定的構造方法Constructor constructor = class1.getConstructor(null);System.out.println(constructor);Constructor constructor2 = class1.getConstructor(int.class,String.class,String.class);System.out.println(constructor2);}}Test3
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;import com.bjsxt.pojo.User;public class Test3 {public static void main(String[] args) throws Exception { // 獲取Class對象Class class1 = Class.forName("com.bjsxt.pojo.User");// 得到無參構造方法的對象Constructor constructor = class1.getConstructor(null); // 通過無參構造方法的對象,創建user類的對象;User user =(User) constructor.newInstance();// 獲取指定的屬性,動態操作屬性Field field = class1.getDeclaredField("userid"); // 這個屬性無需做安全檢查,直接訪問field.setAccessible(true);field.set(user,1001);System.out.println("取出userId這個屬性的值:"+field.get(user));// 動態操作方法,獲取指定的方法Method method = class1.getDeclaredMethod("setUserName", String.class); // 執行該方法method.invoke(user, "張三");Method method2 = class1.getDeclaredMethod("getUserName",null);System.out.println(method2.invoke(user));}}つづく
接下來會不斷更新關于反射的小內容,最后將會以一個小項目多為結尾敬請期待;
感覺收看,如果幫到您,點個贊,關個注,評個論唄,葵花在這里感激不盡!!!
總結
- 上一篇: java的准动态(反射)
- 下一篇: 线程同步之生产者-消费者问题