日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java中如何使用反射调用方法以及获得类中的属性

發布時間:2024/8/23 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

練習代碼保存:

package com.test;import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; import java.util.Date; import java.util.Scanner;public class Main {//獲取指定的一個構造器public Main(){System.out.println("我是Main類無參的構造器");}public Main(int num){System.out.println(num);}private Main(final String statement){System.out.println("我是帶有一個String類型的參數的構造器");}private Main(String str, int num){System.out.println("我是帶有兩個參數的構造器");}public static String getName(String str){return str;}private static void getAge(int age){System.out.println("Age:"+age);}private static void getAll(){//1:獲取構造器所在類的字節碼對象Class<Main> clz = Main.class;//2:獲取clz對象中所有的構造器Constructor<?>[] cs = clz.getConstructors();System.out.println(cs.length);for (Constructor<?> c : cs) {System.out.println(c);}cs = clz.getDeclaredConstructors();System.out.println(cs.length);for(Constructor<?> c : cs){System.out.println(c);}}private static void getOne() throws NoSuchMethodException, SecurityException{//1:獲取構造器所在類的字節碼對象Class<Main> clz = Main.class;//2:獲取clz對象中所有的構造器//需求1:獲取public Main()Constructor<Main> con = clz.getConstructor();System.out.println(con);//需求2:獲取public Main(String statement)con = clz.getDeclaredConstructor(String.class);System.out.println(con);//需求3:獲取private Main(String str, int num)con = clz.getDeclaredConstructor(String.class, int.class);System.out.println(con);}public static void main(String[] args) throws Exception {System.out.println("---------類的實例------------------");//需求1:獲取java.util.Date類的字節碼對象//方式1:使用class屬性Class<java.util.Date> clz1 =java.util.Date.class;//方式2:通過對象的getClass方法獲取,getClass是Object類中的方法java.util.Date date = new java.util.Date();Class<?> clz2 = date.getClass();//方式3:通過Class類中的靜態方法foeName(String className)Class<?> clz3 = Class.forName("java.util.Date");System.out.println(clz1+"\n"+clz2+"\n"+clz3+"\n");System.out.println("----------獲取類的構造器-----------------");getOne();System.out.println("-----------獲取類的所有的構造器----------------");getAll();System.out.println("-----------反射調用構造器創建對象----------------");//1:獲取構造器所在類的字節碼對象Class<Main> clz = Main.class;//2:獲取clz對象中所有的構造器Constructor<Main> con = clz.getDeclaredConstructor(String.class);//3.使用反射創建對象//由于main(String..)為私有的因此,設置訪問權限con.setAccessible(true);String str = "hello";con.newInstance(str);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);}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);} }

在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中如何使用反射调用方法以及获得类中的属性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。