精华内容
下载资源
问答
  • } } /** * 反射调用方法 * @param newObj 实例化一个对象 * @param methodName 对象方法名 * @param args 参数数组 * @return 返回值 * @throws Exception */ public static Object invokeMethod(Object newObj...

    import java.lang.reflect.Method;

    public class testReflect {

    /**

    * @param args

    */

    public static void main(String[] args) {

    try {

    Wu w=new Wu();

    Object[] argspara=new Object[]{};

    testReflect.invokeMethod(w, "outInfo",argspara);

    argspara=new Object[]{"wu"};

    testReflect.invokeMethod(w, "outInfo",argspara);

    argspara=new Object[]{"wu",2};

    testReflect.invokeMethod(w, "outInfo",argspara);

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    /**

    * 反射调用方法

    * @param newObj 实例化的一个对象

    * @param methodName 对象的方法名

    * @param args 参数数组

    * @return 返回值

    * @throws Exception

    */

    public static Object invokeMethod(Object newObj, String methodName, Object[] args)throws Exception {

    Class ownerClass = newObj.getClass();

    Class[] argsClass = new Class[args.length];

    for (int i = 0, j = args.length; i < j; i++) {

    argsClass[i] = args[i].getClass();

    }

    Method method = ownerClass.getMethod(methodName, argsClass);

    return method.invoke(newObj, args);

    }

    }

    class Wu{

    public void outInfo() {

    System.out.println("Wu.outInfo");

    }

    public void outInfo(String s) {

    System.out.println("Wu.outInfo(String s):"+s);

    }

    public void outInfo(String s,Integer n) {

    System.out.println("Wu.outInfo(String s,int n):"+s+n);

    }

    }

    展开全文
  • 手册中 invoke 方法描述是这样子:public Object invoke(Object obj,Object... args)throws IllegalAccessException,IllegalArgumentException,InvocationTargetException为什么执行方法非要传一个 obj 对象?我...

    手册中的 invoke 方法描述是这样子的:

    public Object invoke(Object obj,

    Object... args)

    throws IllegalAccessException,

    IllegalArgumentException,

    InvocationTargetException

    为什么执行方法非要传一个 obj 对象?

    我写了个例子:

    public class Test01 {

    public void m01(String info){

    System.out.println(info);

    }

    }

    public class Reflect {

    public static void main(String[] args) {

    try {

    Method method = Class.forName("com.hack4b.test.Father").getMethod("m01", String.class);

    //method.invoke(?, "Hello"); //问号里的参数为 null 会错误

    } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } catch (ClassNotFoundException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    }

    我只想通过反射机制调用 Test 类的 m01 方法,并传参字符串 Hello 给 info ,然后通过 m01 方法打印出来。

    我一直困惑, invoke 方法第一个参数到底是干什么用的?要执行方法,直接传参数被调用方法的参数就好了啊?为什么还要在第一个参数加一个 Object 类型的对象?

    手册上是这么解释的:

    Parameters:

    obj - the object the underlying method is invoked from

    args - the arguments used for the method call

    看上去,意思是 obj 是调用方法的对象,也就是说指明是哪一个对象去调用方法。

    我写的例子中,我是在 main 方法中通过反射机制获取的 m01 方法并执行,按照上述的意思,我是想用当前对象去调用 m01 方法,于是我就传了个 this 进去,结果 IDE 提示语法错误: Cannot use this in a static context

    然后我又声明了一个 Object 对象传进去,程序也没法跑,还抛异常: java.lang.IllegalArgumentException: object is not an instance of declaring class

    难道是我没理解对?

    展开全文
  • 一个最简单C#反射实例,首先编写类库如下: namespace ReflectionTest { public class WriteTest { //带参数的公共方法 public void WriteString(string s, int i) { Console.WriteLine("Write...
    
    
    一个最简单的C#反射实例,首先编写类库如下:
    namespace ReflectionTest
    { 
    public class WriteTest 
    { 
    //带参数的公共方法
    public void WriteString(string s, int i) 
    { 
    Console.WriteLine("WriteString:" + s + i.ToString()); 
    } 
    //带一个参数的静态方法
    public static void StaticWriteString(string s)
    { 
    Console.WriteLine("StaticWriteString:" + s); 
    } 
    //不带参数的静态方法
    public static void NoneParaWriteString() 
    { 
    Console.WriteLine("NoParaWriteString"); 
    } 
    } 
    }

    控制台程序项目如下:

    class TestApp
    { 
    public static void Main() 
    { 
    Assembly ass; 
    Type type; 
    Object obj; 
    //用来测试静态方法
    Object any = new Object(); 
    //指定类库文件必须使用绝对路径,不能使用相对路径
    ass = Assembly.LoadFile(@"D:\Source Code\00.C#Sudy\01.Reflection\01\ReflectTest.dll"); 
    //命名空间和类的名字必须一起指定 
    type = ass.GetType("ReflectionTest.WriteTest"); 
    /**//*example1---------*/ 
    MethodInfo method = type.GetMethod("WriteString"); 
    string test = "test"; 
    int i = 1; 
    Object[] parametors = new Object[]{test,i}; 
    //在例子1种必须实例化反射要反射的类,因为要使用的方法并不是静态方法。
    //创建对象实例
    obj = ass.CreateInstance("ReflectionTest.WriteTest"); //执行带参数的公共方法
    method.Invoke(obj, parametors); 
    //method.Invoke(any, parametors);//异常:必须实例化反射要反射的类,因为要使用的方法并不是静态方法。
    /**//*example2----------*/ 
    method = type.GetMethod("StaticWriteString"); 
    method.Invoke(null, new string[] { "test"}); //第一个参数忽略//对于第一个参数是无视的,也就是我们写什么都不会被调用,
    //即使我们随便new了一个any这样的Object,当然这种写法是不推荐的。
    //但是对应在例子1种我们如果Invoke的时候用了类型不一致的实例来做为参数的话,将会导致一个运行时的错误。
    method.Invoke(obj, new string[] { "test"});
    method.Invoke(any, new string[] { "test"});
    /**//*example3-----------*/ 
    method = type.GetMethod("NoneParaWriteString"); //调用无参数静态方法的例子,这时候两个参数我们都不需要指定,用null就可以了。method.Invoke(null, null); 
    } 
    }

     

    转载于:https://www.cnblogs.com/engineerlm/p/7290318.html

    展开全文
  • 本文接上文“java反射之获取类信息方法(推荐)”,利用反射(invoke)来获取一个类中方法来执行。1、定义一个类,包含三个名称相同,参数不同方法class A{public void print(){System.out.println("Hello,World")...

    本文接上文“java反射之获取类的信息方法(推荐)”,利用反射(invoke)来获取一个类中的方法来执行。

    1、定义一个类,包含三个名称相同,参数不同的方法

    class A{

    public void print(){

    System.out.println("Hello,World");

    }

    public void print(int a,int b){www.cppcns.com

    System.out.println(a+b);

    }

    public void print(String a,String b){

    System.out.println(a.toUpperCase()+","+b.toLowerCase());

    }

    }

    2、利用方法的反射(invoke)分别获取该类三个方法并执行

    public class Test {

    public static void main(String[] args) {

    /**

    * 获取print(int,int)方法

    * 1、获取类的类类型

    */

    A a1 = new A();

    Class clazz = a1.getClass();

    /**

    * 2、获取方法(名称、参数列表)

    * getMethod()获取的是public方法

    * getDeclaredMethod()获取的是自己声明的方法

    */

    try {

    // Method m = clazz.getMethod("print",new Class[]{int.class,int.class});

    Method m = clazz.getMethod("print", int.class, int.class);

    //方法的反射操作,用m对象进行方法调用,a1.print完全相同

    //方法没有返回值返回null,有返回值返回具体的返回值

    // Object obj = m.invoke(a1,new Object[]{10,20});

    Object obj = m.invoke(a1,10,20);

    System.out.println("=====www.cppcns.com===========================================");

    Method m2 = clazz.getMethod("print", String.class, String.class);

    m2.invoke(a1,"aaa","BBB");

    System.out.println("================================================");

    Method m3 = clazz.getMethod("print");

    m3.invoke(a1);

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    }

    3、完整代码

    package com.format.test;

    import java.lang.reflect.Method;

    /**

    * Created by Format on 2017/6/3.

    */

    public class Test {

    public static void main(String[] args) {

    /**

    * 获取print(int,int)方法

    * 1、获取类的类类型

    */

    A a1 = new A();

    Class clazz = a1.getClass();

    /**

    * 2、获取方法(名称、参数列表)

    * getMethod()获取的是public方法

    * getDeclaredMethod()获取的是自己声明的方法

    */

    try {

    // Method m = clazz.getMethod("print",new Class[]{int.class,int.class});

    Method m = clazz.getMethod("print", int.class, int.class);

    //方法的反射操作,用m对象进行方法调用,a1.print完全相同

    //方法没有返回值返回null,有返回值返回具体的返回值

    // Object obj = m.invoke(a1,new Object[]{10,20});

    Object obj = m.invoke(a1,10,20);

    System.ouhttp://www.cppcns.comt.println("================================================");

    http://www.cppcns.comstem.out.println("Hello,World");

    }

    public void print(int a,int b){

    System.out.println(a+b);

    }

    public void print(String a,String b){

    System.out.println(a.toUpperCase()+","+b.toLowerCase());

    }

    }

    4、执行结果

    bcfd5d879fb59194e7c3c70df1241dfd.png

    以上这篇java反射之方法反射的基本操作方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

    本文标题: java反射之方法反射的基本操作方法

    本文地址: http://www.cppcns.com/ruanjian/java/192836.html

    展开全文
  • 由于setXXX只有一个String数组的参数,所以这是编译器会把字符串数组当作一个可变长度参数 而我们取得方法只有一个参数,所以就会出现wrong number of arguments的异常,我们只要把字符串数组强制转换为一个Object...
  • 反射invoke()方法

    千次阅读 2014-08-28 18:10:20
    java反射invoke()方法   invoke()方法:  主要是为了类反射,可以在不知道具体类情况下,根据配置字符串去调用一个类方法。最简单方法是可以把方法参数化。    main.invoke():  比如Test类里有...
  • java 反射 method invoke 变长参数

    千次阅读 2018-04-09 15:18:21
    看下,反射中可能遇到一个问题:一个类,专门用来进行测试反射相关code:public class InvokeClass { private final static String TAG = "InvokeClassDemo"; public void printString(String... ...
  • 通过Java的反射机制调用某个方法,并传入参数。 1.只传入一个参数hello world: import java.lang.reflect.Method; import java.util.Date; public class InvokeMethodTest {  public static void main(String[]...
  • java中的反射机制通过invoke方法来实现,这中间主要是是通过一下几个函数实现 Class.forName ("类名") Class.forName ("类名").newInstance Class.getMethod ("调用方法名",class[]{参数类列表}) instance....
  • 给用户提供统一接口,将具体方法和参数放到post的参数中,传过来。2.服务器响应后,记录当前时间。3.判断方法参数是否存在3.利用映射得到接口方法类,然后将method和parameter传进去4.得到相应结果5.记录...
  • 反射的作用 1)运行时构造类对象; 2)运行时调用对象方法。 3)运行时判断对象所属类; 4)运行时判断任意一个类所具有成员变量和方法; 5)反射API可以获取程序在运行时刻内部结构。 6)使用反射的一...
  • java反射的invoke方法

    2020-01-07 00:06:04
    1、invoke是Method类下的方法,只有方法才能调用invoke方法, 2、invoke方法的含义:反射调用...4、invoke方法的参数含义:第一个参数的含义是:实例对象,第二个方法的含义是:调用invoke方法的方法中的参数值。 ...
  • 在具有指定参数的方法对象上调用invoke方法对象表示基础方法。 个别参数自动解包以匹配原始形式参数,原始参考参数和参考参数都需要进行方法调用转换。 比如在以下代码中 class Employee{ public static ...
  • //初始化参数 /* 1 */ Object objs = Array.newInstance(Object.class, 2); Array.set(objs, 0, list); Array.set(objs, 1, "23"); method.invoke(single, objs); /* 2 */ Object[] objects = {1, "fuck", list}; ...
  • 希望通过java反射以及泛型来实现动态测试SortClass中的各种排序函数,这时getmethod方法和invoke方法的参数不知道如何解决了。我写的这个实现一直报参数异常代码class SortClass{//选择排序public void selectSo...
  • 展开全部就是调用类中方法e68a843231313335323631343130323136353331333365646239,最简单用法是可以把方法参数化,invoke(class, method)比如你Test类里有一系列名字相似方法setValue1、setValue2等等。...
  • 方法反射操作:method.invoke(对象,参数列表) 反射是框架底层一些方法,比如以后看到Spring重要特性DI:控制反转就是这么一个原理,至于为什么使用反射,1.首先你能通过任意对象获取类类型即是所有信息,这...
  • invoke注入参数调用dubbo接口

    千次阅读 2020-03-30 11:02:31
    最近我们同事写了一个自动化测试工具,通过maven将系统jar包下载下来之后,通过反射的方法就可以获取到该系统对外暴露接口,通过传参就可以很轻易获取到dubbo接口啦。 这里有两个难点(对我来说),1、是如何...
  • 反射invoke()

    2018-02-28 11:07:00
    java的反射用法:(异常请自行处理)①找到类:Class cl = Class.forName("java.util.Date");②创建对象(要求这个类中含有空参数的构造方法):Object obj = cl.newInstence();③根据名称和参数找方法:Method method1 ...
  • invoke回调流程示例 0.由Class对象动态构造对应类型对象 1.Class对象getMethod方法,由方法名和形参构造Method对象 ...如果你把函数指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其...
  • 在学习jdk动态代理时,invoke方法里面需要传入多个参数。动态代理也是传入Object[] args,参数数组。如果是多个参数不能直接传入多个参数,需要创建参数数组 狂神说Spring06:静态/动态代理模式 反射invoke方法 ...
  • java中的反射机制中invoke典型用法

    千次阅读 2009-12-19 23:12:00
    java中的反射机制通过invoke方法来实现,这中间主要是是通过一下几个函数实现 Class.forName ("类名") Class.forName ("类名").newInstanceClass.getMethod ("调用方法名",class[]{参数类列表})instance....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 410
精华内容 164
关键字:

反射invoke的参数