java反射獲取和調(diào)用方法
Class類中獲取方法:
public Method[] getMethods();//獲取包括自身和繼承(實(shí)現(xiàn))過來的所有的public方法——Method不支持泛型<>,即后面不接<>
public Method[] getDeclaredMethods();//獲取自身所有的方法(private、public、protected,和訪問權(quán)限無關(guān)),不包括繼承的
在jdk1.8后可以直接獲取私有屬性的方法不需要設(shè)置權(quán)限 但是僅限于getDeclaredMethod方法 對(duì)于Method 的方法仍然需要設(shè)置
權(quán)限。
public Method[] getMethod(String methodName, Class<T>...parameterTypes);//表示獲取指定的一個(gè)公共的方法,包括繼承的
參數(shù): methodName:表示獲取的方法的名字
parameterTypes:表示獲取的方法的參數(shù)的Class類型
public Method[] getDeclaredMethod(String methodName, Class<T>...parameterTypes);//表示獲取本類中的一個(gè)指定的方法(private、protected、public,與訪問權(quán)限無關(guān)),不包括繼承的方法
Class clazz = new Person().getClass(); try { //調(diào)用指定的方法 /*@SuppressWarnings("unchecked") Method me = clazz.getDeclaredMethod("getName", String.class); me.invoke(clazz.newInstance(),"zhangsan");*/ //獲取所有的方法 Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { System.out.println(method.getName()); } } catch (Exception e) { e.printStackTrace(); }
對(duì)于多個(gè)參數(shù)的方法調(diào)用:getDeclaredMethod后面跟的parameterTypes可以理解為Class類型的形參 ,通過調(diào)用invoke來賦實(shí)參 多個(gè)參數(shù)的賦值 最好是包裝在new Object[]{}中 。
@SuppressWarnings("unchecked") Method method = clazz.getDeclaredMethod("getName",new Class[]{String.class,int.class}); method.invoke(new Person(), new Object[]{"zhangsan",10});
調(diào)用靜態(tài)方法
class User{ public static void staticMethod(){ System.out.println(“static mthod invoke.”); } } Eg: Class<User> clz=User.class; Method staticMethod=clz.getMethod(“staticMthod”);
兩種方式調(diào)用靜態(tài)方法:
1. 因?yàn)殪o態(tài)方法屬于所有實(shí)例對(duì)象公共的,可以創(chuàng)建該類的一個(gè)任意對(duì)象,通過該對(duì)象調(diào)用
staticMethod.invoke(clz.newInstance());//staticMethod無參,故參數(shù)列表類型不填
2. 如果底層方法是靜態(tài)的,那么可以忽略指定的obj參數(shù),將obj參數(shù)設(shè)置為null即可
staticMethod.invoke(null);
更多相關(guān)的內(nèi)容:
一:反射概念
可以通過Class類獲取某個(gè)類的成員變量以及方法,并且調(diào)用之。
二:通過反射獲取方法、變量、構(gòu)造方法
@Test // 通過反射獲取類定義的方法 public void testMethod() throws Exception { @SuppressWarnings("rawtypes") Class clazz = Class.forName("java.lang.String"); Method[] m = clazz.getDeclaredMethods(); for (int i = 0; i < m.length; i++) { System.out.println(m[i].getName() + " " + m[i].getDeclaringClass()); } } @Test // 通過反射獲取類定義的變量 public void testField() throws Exception { @SuppressWarnings("rawtypes") Class clazz = Class.forName("java.lang.String"); Field[] fields = clazz.getFields(); for (Field f : fields) { System.out.println(f.getName()); } } @Test // 通過反射獲取類定義的構(gòu)造方法 public void testConstructor() throws Exception { @SuppressWarnings("rawtypes") Class clazz = Class.forName("java.lang.String"); @SuppressWarnings("rawtypes") Constructor[] cons = clazz.getConstructors(); for (@SuppressWarnings("rawtypes") Constructor c : cons) { System.out.println(c + " " + c.getDeclaringClass()); } }
三:通過反射調(diào)用類定義的方法
@Test // 通過反射調(diào)用類定義的方法 public void testInvokeMethod() throws Exception { Class clazz = Class.forName("java.lang.String"); // 定義參數(shù)類型 Class[] params = new Class[1]; params[0] = String.class; Method m = clazz.getDeclaredMethod("indexOf", params); // 設(shè)置參數(shù) Object[] p = new Object[1]; p[0] = "e"; Integer s = (Integer) m.invoke("helloworld!", p); System.out.println(s); }
相關(guān)文章
Mybatis中通過generator生成mapper、Dao、mapper.xml的方法
這篇文章主要介紹了Mybatis中通過generator生成mapper、Dao、mapper.xml的方法,需要的朋友可以參考下2017-01-01xxl-job如何濫用netty導(dǎo)致的問題及解決方案
本篇文章講解xxl-job作為一款分布式任務(wù)調(diào)度系統(tǒng)是如何濫用netty的,導(dǎo)致了怎樣的后果以及如何修改源碼解決這些問題,netty作為一種高性能的網(wǎng)絡(luò)編程框架,十分受大家喜愛,今天就xxl-job濫用netty這一問題給大家詳細(xì)下,感興趣的朋友一起看看吧2021-05-05Spring Boot 日志功能深度解析與實(shí)踐指南
本文詳細(xì)介紹了SpringBoot的日志功能,包括默認(rèn)日志框架Logback,日志級(jí)別配置,日志格式自定義,日志文件輸出,日志歸檔與清理,自定義日志配置,與其他日志框架的集成以及日志性能優(yōu)化,通過結(jié)合實(shí)際場景,提供了詳細(xì)的配置與實(shí)踐指南,感興趣的朋友一起看看吧2025-01-01java查找字符串中的包含子字符串的個(gè)數(shù)實(shí)現(xiàn)代碼
下面小編就為大家?guī)硪黄猨ava查找字符串中的包含子字符串的個(gè)數(shù)實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06獲取Java加載器和類完整結(jié)構(gòu)的方法分享
這篇文章主要為大家詳細(xì)介紹了獲取Java加載器和類完整結(jié)構(gòu)的方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下2022-12-12mybatis動(dòng)態(tài)sql之新增與更新方式
這篇文章主要介紹了mybatis動(dòng)態(tài)sql之新增與更新方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07