通过反射调用类中的方法

操作步骤:
1:实例化Class;
2:通过Class类的getMethod()方法取得一个Method的对象,并设置次方法操作时所需的参数类型;
3:使用invoke进行调用,并向方法中传递要设置的参数,但在使用invoke()方法时必须传入一个类的实例化对象

实例1:sayChina()方法中没有参数
package cn.itcast02;

import java.lang.reflect.Method;

//调用Person类中的sayChina()方法,没有参数

public class ClassDemo04 {
     public static void main(String[] args) {
          Class<?> c1 = null;
           try {
              c1 = Class. forName("cn.itcast02.Person");
          } catch (ClassNotFoundException e) {
               // TODO Auto-generated catch block
              e.printStackTrace();
          }
           try {
               //获得一个method对象
              Method method = c1.getMethod( "sayChina");
               //调用方法,必须传递对象实例
              method.invoke(c1.newInstance());
          } catch (Exception e) {
               // TODO Auto-generated catch block
              e.printStackTrace();
          }
     }
}

实例2:sayHello()方法中有参数

package cn.itcast02;

import java.lang.reflect.Method;

//调用Person类中的sayHello()方法,有参数

public class ClassDemo05 {
     public static void main(String[] args) {
          Class<?> c1 = null;

           try {
              c1 = Class. forName("cn.itcast02.Person");
          } catch (ClassNotFoundException e) {
               // TODO Auto-generated catch block
              e.printStackTrace();
          }
           try {
              Method method = c1.getMethod( "sayHello", String.class,int .class,char. class);
               //调用方法,必须传递对象实例,同时传递三个参数值
              Object invoke = method.invoke(c1.newInstance(),"侯勇" ,50,‘男‘ );
              System. out.println(invoke);
          } catch (Exception e) {
               // TODO Auto-generated catch block
              e.printStackTrace();
          }
     }
}

 

实例3:调用getter和setter方法

package cn.itcast02;

import java.lang.reflect.Method;

//调用Person类中的sayChina()方法

public class ClassDemo04 {
     public static void main(String[] args) {
          Class<?> c1 = null;
          Object obj = null;
           try {
              c1 = Class. forName("cn.itcast02.Person");
          } catch (ClassNotFoundException e) {
               // TODO Auto-generated catch block
              e.printStackTrace();
          }
           try {
              obj = c1.newInstance();
          } catch (Exception e) {
               // TODO Auto-generated catch block
              e.printStackTrace();
          }
           try {
              Method method = obj.getClass().getMethod("setName" ,String.class);
              Method method2 = obj.getClass().getMethod("setAge" ,int.class);
              method.invoke(obj, "小红");
              method2.invoke(obj, 30);
          } catch (Exception e) {
               // TODO Auto-generated catch block
              e.printStackTrace();
          }
           try {
              Method method = obj.getClass().getMethod("getName" );
              Method method2 = obj.getClass().getMethod("getAge" );
              System. out.println(method.invoke(obj));
              System. out.println(method2.invoke(obj));
          } catch (Exception e) {
               // TODO Auto-generated catch block
              e.printStackTrace();
          }
     }
}

  

Person类
package cn.itcast02;

public class Person implements China{
	private String name;
	private int age;
	private char sex;

	public Person() {
		super();
	}

	public Person(String name, int age, char sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}
	public void eat()
	{
		System.out.println("吃了");
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}

	@Override
	public void sayChina() {
		// TODO Auto-generated method stub
		System.out.println("作者:"+ AUTHOR + "国籍:"+ NATIONAL);
	}

	@Override
	public String sayHello(String name, int age, char sex) {
		// TODO Auto-generated method stub
		return "姓名:" + name +"年龄:"+ age +"性别:"+ sex;
	}

}

  

China接口
package cn.itcast02;

public interface China {
	public static final String NATIONAL = "China";
	public static final String AUTHOR = "成龙";

	public void sayChina();

	public String sayHello(String name, int age, char sex);
}

  

 

时间: 2025-01-02 18:14:05

通过反射调用类中的方法的相关文章

Java_通过反射调用类中的方法

先上一个基本的封装: /** * 获取classType * * @param type * @param provinceCode * @param cityCode * @return * @throws Exception */ public Class<?> getClassType(String type, String provinceCode, String cityCode, String suffix) throws Exception { Class<?> cl

使用Java的反射功能调用类中的方法

最近一直在搞Java的反射,今天使用反射调用方法时出现了很多问题,主要是没有详细参考官方API.所以走了很多弯路. 所以想把这个例子记下来,供自己也供他人学习. package com.mine.practice.reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 使用反射调用类中的方法 * @author 2014-11-5 上午10:51:28

通过反射 调用 类里面的 方法的方法

通过反射 调用 类里面的 方法的方法(注意 重载 ,可以 按F12转到 定义 查看 ): 错误方法: MethodInfo dynMethod = this.GetType().GetMethod("Draw_" + itemType); dynMethod.Invoke(this, new object[] { methodParams }); 正确 方法 : MethodInfo dynMethod = this.GetType().GetMethod("Draw_&qu

C#如何通过反射调用类下的方法

首先模拟一个mvc的项目,创建一个业务类(HomeService),在类下创建3个方法 public class HomeService { /// <summary> /// 无参方法 /// </summary> /// <returns></returns> public string SayHello() { string str = "你好!"; return str; } /// <summary> /// 有参方

C#通过反射获取类中的方法和参数个数,反射调用方法带参数

using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(string[] args) { //反射获取 命名空间+类名 string className = "ConsoleApp2.ClassSample"; string methodName = "test1"; //传递参数 Object[] paras = new Obje

C#反射调用类的私有方法

void Main() { var type = typeof(StockClass); type.Dump(); var fields=type.GetFields(BindingFlags.Instance|BindingFlags.NonPublic).Dump("字段"); var members = type.GetMethods().Dump("方法"); //调用私有的构造函数,获得实例化对象 object obj=type.GetConstructo

Java反射调用多种类型的方法总结

最近一直在搞Java中的反射,遇到了小问题,所以总结下反射时调用方法需要注意的事项以及各种例子. 本例主要实现的功能有 * 1.没有参数的方法 * 2.一个参数的方法,没有返回值的方法 * 3.多个参数的方法 * 4.参数为数组的方法 * 5.参数为集合的方法 * 6.返回值为数组的方法 下面直接来例子 package com.mine.practice.reflectMethod; import java.lang.reflect.InvocationTargetException; impo

Java反射机制demo(五)—获得并调用一个类中的方法

这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和运行结果.获取所有的方法使用Class类中getMethos()方法. 待获取的类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 package

java 27 - 6 反射之 通过配置文件运行类中的方法

在以前,如果我们想要调用一个类中的方法,只能这样子: 例: 有Cat和Dog两个类,里面有eat和run两个成员方法: 1 public class Dog { 2 3 public void eat() { 4 System.out.println("狗吃肉"); 5 } 6 7 public void run() { 8 System.out.println("狗刨"); 9 } 10 } public class Cat { public void eat()