java对过反射调用方法

 
public class InvokeTester {
    public InvokeTester() {
    }

    String str;

    public InvokeTester(String str) {
        this.str = str;
    }

    public int add(int param1, int param2) {
        return param1 + param2;
    }

    public String echo(String msg) {
        return "echo: " + msg;
    }

    public String getStr() {
        return "one param ctor" + str;
    }

    public static void main(String[] args) throws Exception {
        //直接获取类
        //Class<?> classType = InvokeTester.class;
        //通过完整的类型路径获取类
        Class<?> classType = Class.forName("com.top.utils.InvokeTester");
        //使用newInstance创建对象
        // Object invokeTester = classType.newInstance();
        //使用默认构造函数获取对象
        Object invokeTester = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
        //获取InvokeTester类的add()方法
        Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class});
        //调用invokeTester对象上的add()方法
        Object result = addMethod.invoke(invokeTester, new Object[]{new Integer(100), new Integer(200)});
        System.out.println((Integer) result);
        //获取InvokeTester类的echo()方法
        Method echoMethod = classType.getMethod("echo", new Class[]{String.class});
        //调用invokeTester对象的echo()方法
        result = echoMethod.invoke(invokeTester, new Object[]{"Hello"});
        System.out.println((String) result);
        //创建有参构造函数的类对象
        Object invokeTester1 = classType.getConstructor(new Class[]{String.class}).newInstance(new Object[]{new String("测试一个带参数的构造调用")});
        //获取方法方式相同
        Method getStrMethod = classType.getMethod("getStr");
        Object str = getStrMethod.invoke(invokeTester1);
        System.out.println(str);
    }
}

在例程InvokeTester类的main()方法中,运用反射机制调用一个InvokeTester对象的add()和echo()方法

add()方法的两个参数为int 类型,获得表示add()方法的Method对象的代码如下:

Method addMethod=classType.getMethod("add",new Class[]{int.class,int.class});

Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象,如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回。

在本例中,尽管InvokeTester 类的add()方法的两个参数以及返回值都是int类型,调用add Method 对象的invoke()方法时,只能传递Integer 类型的参数,并且invoke()方法的返回类型也是Integer 类型,Integer 类是int 基本类型的包装类:

Object result=addMethod.invoke(invokeTester,

new Object[]{new Integer(100),new Integer(200)});

System.out.println((Integer)result); //result 为Integer类型

时间: 2024-10-13 09:02:59

java对过反射调用方法的相关文章

java反射调用方法

1:Class类中的方法 public Method getDeclaredMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException 参数: name - 方法名 parameterTypes - 参数数组 返回: 该类与指定名和参数相匹配的方法的 Method 对象 2:Method类中的方法; public Object invoke(Object obj,

跟王老师学反射(六):使用反射调用方法

跟王老师学反射(六):使用反射调用方法 主讲教师:王少华   QQ群号:483773664 学习内容 使用反射调用方法 当获得某个类对应的Class对象后,就可以通过该Class对象的getMethods()方法或getMethod()方法来获取全部方法或指定方法,这二个方法的返回值是Method对象数组,或者Method对象. 一.public Objectinvoke(Object obj,  Object... args) 获得Method对象后,程序就可以通过该Method来调用对应的方

原 .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)

大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能:这些问题却没有统一的描述. 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议.为了解决反射的性能问题,你可以遵循本文采用的各种方案. 本文内容 反射各方法的性能数据 反射的高性能开发建议 创建类型的实例 反射获取 Attribute 反射调用公共 / 私有方法 使用预编译框架 附本文性能测试所用的代码 所有反射相关方法 IsDefined 和 GetCustomAttribute 的专项比较 参考资料 反

反射学习(三)--------利用反射调用方法

利用反射调用方法 C1 newC1Instance = new C1(); var funM = newC1Instance.GetType().GetMethod("fun", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); object[] para = { }; if (funM == null) { Console.Write("error, fu

利用特性区分查找方法,并通过反射调用方法

如示例代码,buf带描述标记 /// <summary> /// 分析 数据 /// </summary> /// <param name="buf"></param> public void AnalysisDatabuf(string buf) { if (string.IsNullOrEmpty(buf)) return; try { string optNo = buf.Substring(0, 5); string descri

aspx反射调用方法

string name = base.Request["action"]; object obj2 = base.GetType().InvokeMember(name, BindingFlags.InvokeMethod, null, this, new object[0]); if (obj2 != null) { s = obj2.ToString(); } 传入方法名即可调用方法 原文地址:https://www.cnblogs.com/codeDevotee/p/113307

Java反射(三)利用反射调用方法

有Student类: package testreflection; public class Student{ private static int count; private String stuNum; public Student(String stuNum) { // TODO Auto-generated constructor stub this.stuNum = stuNum; count++; } public String getStuNum() { return stuN

黑马程序员-JAVA学习之反射getDeclaredField()方法与getField()方法的区别

--------android培训.java培训.期待与你交流!-------- 在使用反射的时候,常用到的几个方法老是傻傻的分不清楚是干吗的,功能差不多的啊,比如:Class.getFields(), Class.getField(String), Class.getDeclaredFields(), Class.getDeclaredField(String)和Class.getMethods(), Class.getMethod(String, Class[]), Class.getDec

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