这是无参方法的调用
package com.itheima;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 无参方法调用
*/
public class Test5 {
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
Reflect_Class ref=new Reflect_Class();//实例化类
Method method=ref.getClass().getMethod("method");//通过反射获取Method对象
method.invoke(ref);//通过Method类中的invoke()方法调用Reflect_Class类中的方法
}
}
//定义一个类
class Reflect_Class{
//在类中定义一个方法
public void method(){
System.out.println("aaaaaaaaaaaaaa");//打印字符串
}
}
这是有参数方法的调用
package com.lianxi;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class LianXi{
public static void main(String[] args) throws Exception {
// method();
// method1();
method_main();
}
/*
* 通过反射调用另一个类中的主方法
*/
public static void method_main()throws Exception{
String mainPath="com.lianxi.Main_Class";
Method m=Class.forName(mainPath).getMethod("main",String[].class);
//这里要注意,因为JDK1.5才出现的可变参数,之前用的都是数组,为了兼容以前的,传入数组会被分开了解析,所以这里这样直接写,就会被解析成三个字符串对象,而不是一个字符串数组了
// m.invoke(null,new String[]{"111","222","333"});//注意因为类中的主方法值静态的,所以invoke的第一个参数要用null
//解决方式一:把要传入的数组再封装一层,变成一个数组就可以了
// m.invoke(null,new Object[]{new String[]{"111","222","333"}});
//解决方式二:直接把字符串数组进行强转
m.invoke(null,(Object)new String[]{"111","222","333"});
}
public static void method1() throws Exception{
String str="abcdefg";
Method m=String.class.getMethod("charAt",int.class);
System.out.println(m.invoke(str,2));//如果invoke()方法第一个参数为null这意味着该Method对象对应的是一个静态方法,因为静态方法调用不需要实例
System.out.println("-----------------------------");
LianXi_reflect ref=new LianXi_reflect();
Method mm=ref.getClass().getMethod("demo");
mm.invoke(ref);//执行反射指定方法
}
}
class Main_Class{//定义一个类
public static void main(String[]args){//main方法打印传进来的参数
for(String arg:args){
System.out.println(arg);
}
}
}
class LianXi_reflect{
public void demo(){
System.out.println("cccccccccccc");
}
}