java中如何使用反射调用方法以及获得类中的属性
使用反射獲取類中的方法:
1):獲取方法所在類的字節碼對象.
2):獲取方法.
------------------------------------------------------------------------
Class類中常用方法:
publicMethod[] getMethods():獲取包括自身和繼承過來的所有的public方法
publicMethod[] getDeclaredMethods():獲取自身類中所有的方法(不包括繼承的,和訪問權限無關)
publicMethod getMethod(StringmethodName,
??????????????????????? Class<?>...parameterTypes):表示調用指定的一個公共的方法(包括繼承的)
?????? 參數:
?????????????? methodName: 表示被調用方法的名字
??????????????parameterTypes:表示被調用方法的參數的Class類型如String.class
publicMethod getDeclaredMethod(String name,
???????????????????????????????Class<?>... parameterTypes):表示調用指定的一個本類中的方法(不包括繼承的)
??????? 參數:
?????????????? methodName: 表示被調用方法的名字
??????????????parameterTypes:表示被調用方法的參數的Class類型如String.class
代碼:
System.out.println("-----------使用反射調用方法----------------");Class clzz = Main.class;Constructor<Main> conm = clzz.getConstructor();Main instance = conm.newInstance();//獲取instance對象來調用方法instance.getOne();//獲取所有的方法Method[] methods = clzz.getMethods();for (Method method : methods) {//獲取類中方法的全名(eg:public com.test.Main())System.out.println(method);}使用反射調用方法:
1):獲取方法所在類的字節碼對象.
2):獲取方法對象.
3):使用反射調用方法.
------------------------------------------------------------------------
如何使用反射調用一個方法:
在Method類中有方法:
publicObject invoke(Object obj,Object... args):表示調用當前Method所表示的方法
????? 參數:
??????????? obj: 表示被調用方法底層所屬對象
???????????????? Method m =clz.getMethod("sayHi",String.class);
??????????? args:表示調用方法是傳遞的實際參數
????? 返回:
??????????? 底層方法的返回結果
調用私有方法:
? 在調用私有方法之前:應該設置該方法為可訪問的
又因為Method是AccessibleObject子類,所以Method中具有該方法.
sayGoodByeMethod.setAccessible(true);
System.out.println("-----------使用反射調用方法----------------");Class<Main> zlz = Main.class;//調用public類型方法System.out.println("public類型方法");Method method = zlz.getMethod("getName",String.class);//第一個參數為方法名、第二個為方法中參數類型Object invoke = method.invoke(zlz.newInstance(),"weijie");System.out.println(invoke);//調用private類型方法System.out.println("private類型方法");Method method2 = zlz.getDeclaredMethod("getAge",int.class);Object invoke2 = method2.invoke(zlz.newInstance(),22);Output:
-----------使用反射調用方法----------------
public類型方法
我是Main類無參的構造器
weijie
private類型方法
我是Main類無參的構造器
Age:22
在Java反射中Field用于獲取某個類的屬性或該屬性的屬性值
一:如何通過Field反射獲取類的屬性
?Field提供如下幾種方法:
:1:Class.getDeclaredField(String name);
返回一個 Field 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明字段(包括私有成員)。
2:Class.getDeclaredFields();
?返回 Field 對象的一個數組,該數組包含此 Class 對象所表示的類或接口所聲明的所有字段(包括私有成員)。
3:Class.getField(String name);
返回一個 Field 對象,它反映此 Class 對象所表示的類或接口的指定公共成員字段。
4:Class.getFields();
返回一個包含某些?Field 對象的數組,該數組包含此 Class 對象所表示的類或接口的所有可訪問公共字段。
package producer;import java.lang.reflect.Field; import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.locks.ReentrantLock; import java.util.regex.Matcher; import java.util.regex.Pattern;class Person { public String name; private Integer age; private String sex; //省略所有屬性的set、get方法 public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;} } public class Main {public static void main(String[] args) throws Exception, SecurityException { Person person = new Person();// 通過Class.getDeclaredField(String name)獲取類或接口的指定已聲明字段。Field f1 = person.getClass().getDeclaredField("name");System.out.println("-----Class.getDeclaredField(String name)用法-------");System.out.println(f1);System.out.println("-----Class.getDeclaredFields()用法-------");// 通過Class.getDeclaredFields()獲取類或接口的指定已聲明字段。Field[] f2 = person.getClass().getDeclaredFields();for (Field field : f2) {System.out.println(field);}System.out.println("-----Class.getField(String name)用法-------");// 通過Class.getField(String name)返回一個類或接口的指定公共成員字段,私有成員報錯。Field f3 = person.getClass().getField("name");//給屬性賦值f3.set(person, "hello java");System.out.println(f3);//獲取屬性值System.out.println(f3.get(person));// 如果獲取age屬性(私有成員) 則會報錯// Field f3=person.getClass().getField("name");System.out.println("-----Class.getFields()用法-------");// 通過Class.getField(),返回 Class 對象所表示的類或接口的所有可訪問公共字段。Field[] f4 = person.getClass().getFields();for (Field fields : f4) {// 因為只有name屬性為共有,因此只能遍歷出name屬性System.out.println(fields);}} }參考博客:https://blog.csdn.net/vipmao/article/details/51638547
總結
以上是生活随笔為你收集整理的java中如何使用反射调用方法以及获得类中的属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis stream学习总结
- 下一篇: DBUtils使用详细示例(转载)