java中invoke()的作用是什么?
java 中 invoke()的作用是什么?
在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到Method,这时去调用父类的对象也会报错。虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java是如何实现的,就学习了下Method的源代码。 Method的invoke方法:1、先检查 AccessibleObject的override属性是否为true。AccessibleObject是Method,Field,Constructor的父类,override属性默认为false,可调用setAccessible方法改变,如果设置为true,则表示可以忽略访问权限的限制,直接调用。2、如果不是ture,则要进行访问权限检测。用Reflection的quickCheckMemberAccess方法先检查是不是public的,如果不是再用Reflection.getCallerClass方法获得到调用这个方法的Class,然后做是否有权限访问的校验,校验之后缓存一次,以便下次如果还是这个类来调用就不用去做校验了,直接用上次的结果。3、调用MethodAccessor的invoke方法。每个Method对象包含一个root对象,root对象里持有一个MethodAccessor对象。我们获得的Method独享相当于一个root对象的镜像,所有这类Method共享root里的MethodAccessor对象,(这个对象由ReflectionFactory方法生成,ReflectionFactory对象在Method类中是static final的由native方法实例化。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
c# 中反射里的invoke方法的参数
一个最简单的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);
}
}
从上面的总结中可以看出,对于外部调用的动态库应用反射时要用到Assembly.LoadFile(),然后才是获取类型、执行方法等;
当用反射创建当前程序集中对象实例或执行某个类下静态方法时只需通过Type.GetType("类的完整名")。
c#中方法的参数可以有哪几种传递方式
c#中方法的参数可以有三种传递方式,方式如下:1、传入一个大小为2的一位数组来传递最大值和最小值。using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { Program p = new Program(); int maxa = 0,mina =0; int []array = new int[5]{1,2,3,4,5}; int[] array2 = new int[2]; p.getMaxandMin(array, array2); Console.WriteLine("最大值为" + array2[0]); Console.WriteLine("最小值为" + array2[1]); Console.Read(); } public void getMaxandMin(int[] array,int []array2) { int max = array[0]; int min= array[0]; for (int i = 0; i < array.Length; i++) { if (array[i] > max) { max = array[i]; } if (array[i] < min) { min = array[i]; } } array2[0] = max; array2[1] = min; } } } 2、传入一个对象来传递数组的最大值和最小值。using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication3 { class Program { private int max; private int min; static void Main(string[] args) { Program p = new Program(); p.max = 0; p.min = 0; int []array = new int[5]{1,2,3,4,5}; p.getMaxandMin(array, p); Console.WriteLine("最大值为{0},最小值为{1}", p.max,p.min); Console.Read(); } public void getMaxandMin(int[] array,Program p2) { int max = array[0]; int min= array[0]; for (int i = 0; i < array.Length; i++) { if (array[i] > max) { max = array[i]; } if (array[i] < min) { min = array[i]; } } p2.max = max; p2.min = min; } } } 3、用ref 指针来传递参数 。namespace ConsoleApplication3 { class Program { private int max; private int min; static void Main(string[] args) { Program p = new Program(); int max1=0; int min1=0; int[] array = new int[5] { 1, 2, 3, 4, 5 }; p.getMaxandMin(array, ref max1, ref min1); Console.WriteLine("最大值为{0},最小值为{1}",max1, min1); Console.Read(); } public void getMaxandMin(int[] array, ref int max,ref int min) { max = array[0]; min = array[0]; for (int i = 0; i < array.Length; i++) { if (array[i] > max) { max = array[i]; } if (array[i] < min) { min = array[i]; } } } } }
java 中 invoke()的作用是什么?
invoke(调用)就是调用Method类代表的方法。可以实现动态调用,例如可以动态的传人参数,可以把方法参数化。可以把方法参数化invoke(class, method),比如Test类里有一系列名字相似的方法setValue1、setValue2等等,可以把方法名存进数组v[],然后循环里invoke(test,v[i]),就顺序调用了全部setValue。此外,invoke()对带有指定参数的指定对象调用,个别参数被自动解包,与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。如下public Object invoke(Object obj,Object... args)throws IllegalAccessException,IllegalArgumentException,InvocationTargetException如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。扩展资料:语言特点1.简单性Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。例如,Java不支持go to语句,代之以提供break和continue语句以及异常处理。2.分布性Java设计成支持在网络上应用,它是分布式语言。Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。3.编译和解释性Java编译程序生成字节码(byte-code),而不是通常的机器码。Java字节码提供对体系结构中性的目标文件格式,代码设计成可有效地传送程序到多个平台。Java程序可以在任何实现了Java解释程序和运行系统(run-time system)的系统上运行。参考资料来源:oracle官网——Class Method( invoke()见底部)
java中的反射,invoke方法详解
就是调用类中的方法,最简单的用法是可以把方法参数化,invoke(class, method)比如你Test类里有一系列名字相似的方法setValue1、setValue2等等。可以把方法名存进数组v[],然后循环里invoke(test,v[i]),就顺序调用了全部setValue如:public class MyTest{ public static void main(String[] args) { String [] names ={"tom","tim","allen","alice"}; Class clazz = Test.class; try Method method = clazz.getMethod("sayHi", String.class);for(String name:names)method.invoke(clazz.newInstance(),name);} catch (NoSuchMethodException e) e.printStackTrace(); } catch (IllegalAccessExcepti e.printStackTrace( } catch (IllegalArgumentException {e.printStackTrace();} catch (InvocationTargetException e)e.printStackTrace(); } catch (InstantiationException e {e.printStackTrace( }class Test{public void sayHi(String name){ System.out.println("Hi "+name); }
编程语言一共有多少种?
编程语言的种类繁多,总的来说分为机器语言、汇编语言以及高级语言三大类。机械语言(machine language):计算机可直接识别、运行的二进制代码,执行速度快,资源占用少,但可读性不强,编程复杂;汇编语言(assembly language):一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。目标代码简短,占用内存少,执行速度快,但缺乏可移植性,编程复杂;高级语言(High-level programming language):相对于机器语言以及汇编语言,高级语言的可读性强,可移植性高,一般通过事先编好的一个叫做编译程序的机器语言程序编译成用机器指令表示的目标程序。现在流行的高级语言有Java、C语言、C++、C#、Pascal、Basic等等。