java反射invoke方法(java中invoke()的作用是什么)

本文目录
java中invoke()的作用是什么
用来执行一个方法,是反射中知识 。
就是调用类中的方法,最简单的用法是可以把方法参数化invoke(class, method)。
比如你Test类里有一系列名字相似的方法setValue1、setValue2等等。
可以把方法名存进数组v),就顺序调用了全部setValue。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程
在JAVA中,怎么利用反射获取一个方法
java中利用反射获取方法:
1.先找到方法所在类的字节码
2.找到需要被获取的方法
Class类中获取方法:
public Method getMethods();获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型《》,即后面不接《》
public Method getDeclaredMethods();获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的
public Method getMethod(String methodName, Class《T》...parameterTypes);表示获取指定的一个公共的方法,包括继承的
参数: methodName:表示获取的方法的名字
parameterTypes:表示获取的方法的参数的Class类型
public Method getDeclaredMethod(String methodName, Class《T》...parameterTypes);//表示获取本类中的一个指定的方法(private、protected、public,与访问权限无关),不包括继承的方法。
参数:methodName: 表示被调用方法的名字
parameterTypes:表示被调用方法的参数的Class类型如String.class只有通过方法签名才能找到唯一的方法,方法签名=方法名+参数列表(参数类型、参数个数、参数顺序)。
public Method getDeclaredMethod(String name,Class... parameterTypes):表示调用指定的一个本类中的方法(不包括继承的)
参数: methodName: 表示被调用方法的名字
parameterTypes:表示被调用方法的参数的Class类型如String.class
举例:
class P{
public void t1(){}
void t2(){}
private void t3(){}
}
class People extends P{
public void sayHi() {
System.out.println("sayHi()");
}
public void sayHello(String name) {
System.out.println("sayHello(String name) " + "name = " + name);
}
private void sayGoodBye(String name, int age) {
System.out.println("sayGoodBye(String name, int age) " + "name = " + name + " age = " + age);
}
}
public class MethodDemo {
public static void main(String args) throws Exception {
Class clazz = People.class;
//获取类自身及父类所有public方法
Method ms = clazz.getMethods();
for (Method m : ms) {
System.out.println(m);
}
System.out.println("---------------------------");
//获取类自身所有方法(不会获取父类方法)
ms = clazz.getDeclaredMethods();
for (Method m : ms) {
System.out.println(m);
}
System.out.println("---------------------------");
//只能获取父类中的public方法,无法获取到父类的默认权限和private权限方法
Method m = clazz.getMethod("t1", null);//public void com.reflex.P.t1()
System.out.println(m);
m = clazz.getMethod("sayHello", String.class);
System.out.println(m);
//Exception in thread "main" java.lang.NoSuchMethodException: com.reflex.People.sayGoodBye(java.lang.String, int)
//getMethod方法只能获取public的
// m = clazz.getMethod("sayGoodBye", String.class,int.class);
// System.out.println(m);
m = clazz.getDeclaredMethod("sayGoodBye", String.class,int.class);
System.out.println(m);
//带Declared的无法获取父类中的方法
// m = clazz.getDeclaredMethod("t1", null);//Exception in thread "main" java.lang.NoSuchMethodException:com.reflex.People.t1()
// System.out.println(m);
}
}
通过反射获取 private voidfunction( ) () 方法并调用
在Java中,可以使用反射机制来获取和调用类中的私有方法。以下是一段示例代码,用于演示如何通过反射获取和调用私有方法:
在上述代码中,首先创建了一个ReflectionDemo类的实例obj,然后使用getDeclaredMethod方法获取了名为voidFunction的私有方法,并将其封装到一个Method对象中。
由于该方法是私有的,需要使用setAccessible方法取消访问限制,才能够对其进行访问和调用。
最后,使用invoke方法调用该方法,并传入需要调用的对象作为参数。这里我们将obj作为参数传递给invoke方法,表示要对obj对象调用voidFunction方法。
需要注意的是,在使用反射调用私有方法时,需要小心使用,因为这种方式会绕过Java语言的访问控制机制,可能会对系统的安全性产生影响。
Java反射invoke怎么用
Java反射中invoke的用法,我给你个例子,你看看吧(每一句都有注释)
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
public class S{
public void test(){
System.out.println("test");
}
public static void main(String args) throws Exception {
//获取S类
Class clzz = Class.forName("S");
//获取S类默认无参构造方法
Constructor con = clzz.getDeclaredConstructor();
//创建一个S类实例对象
S s =(S)con.newInstance();
//获取S类的公有成员方法test
Method m=clzz.getDeclaredMethod("test");
//调用S类对象s中的公有成员方法test
m.invoke(s);
}
}

本文相关文章:
actionlistener接口使用教程(请说明Action接口有什么作用(JSP相关))
2026年9月21日 08:15
javaajax请求(ajax基础(java),请求URL有什么作用)
2026年9月9日 09:30
图形控件有哪些(VB里面的picture是什么意思,作用是什么)
2026年8月28日 20:00
server服务器的作用(服务器有什么作用(简单点)服务器相当于电话通信的什么设备)
2026年8月28日 18:15
数据库引擎面试题(一道面试题 :sql server 2000有哪些数据库系统,它们各自的作用是什么)
2026年7月20日 14:45
更多文章:
java中swithcase(Java中为什么我写switch语句,在case后加break就错误,不加就正确,很困惑,)
2026年5月14日 02:30
oracle vm virtualbox 的配置(oracle vm virtualbox 中如何设置外设SD卡)
2025年12月22日 12:00
停止沸腾的水浇上冷水后会沸腾原理(烧瓶中停止沸腾的水,浇上冷水后会重新沸腾,说明)
2025年5月29日 20:15
javabus怎么上不去了(为什么JAV连续几天都登不上去)
2026年3月30日 04:30
威斯布鲁克生涯数据统计(威斯布鲁克离开湖人到快船场均多少分威少离开湖人到快船场均得分夕夕少)
2025年6月7日 15:00
存储过程的理解(oracle中的存储过程有什么作用,该怎么理解(数据更新的话用update语句不就完了吗))
2025年8月12日 19:30
linux重启网卡(请问linux配置网卡后,单独关掉网卡和重启网卡的命令是什么)
2026年5月13日 20:45
field是姓氏吗(求F开头的英文姓氏 有适合女生的姓氏吗(我知道姓氏不分男女))
2025年11月10日 11:15
美国参议院通过史上最大气候法案(拜登的“重大胜利”美国史上最大的气候投资法案通过意味着什么)
2026年5月7日 21:15
c语言messagebox用法(VC++中messagebox的用法)
2026年5月7日 04:30
inspect是什么意思(inspect 和 test 的区别)
2026年6月3日 07:30
西安建站公司模板(企业官方网站用什么样的模板建站合适(下))
2026年2月28日 20:15












