如何根据方法名字符串反射执行该方法

如何根据方法名字符串反射执行该方法,第1张

Java中要用到反射,首先就必须要获取到对应的class对象,在Java中有三种方法获取类对应的class对象。 1、通过类的class属性 2、通过类实例的getClass()方法获取 3、通过ClassforName(String className)方法获取 现在比如在package下有个类

利用默认成员特性可以动态的获取此方法名

下面是一个示例:

using System;

using SystemReflection;

namespace Cshcn

{

public class Program

{

static void Main()

{

TestClass t=new TestClass();

string methodName=tGetMethod();//调用成员GetMethod,并返回成员名

if(methodName!=null)

ConsoleWriteLine(methodName);

}

}

[DefaultMemberAttribute("GetMethod")] //特性:绑定类型的默认成员

public class TestClass

{

public string GetMethod()

{

Type t=typeof(TestClass);

MemberInfo[] mi=tGetDefaultMembers();

if(miLength>0)

{

foreach(MemberInfo m in mi)

{

ConsoleWriteLine("Return owner name");

return mName; //返回方法名

}

}

return null;

}

}

}

"在运行时要在方法Myfun()中得到这个方法的名称,有没有什么一般的通用方法?"

利用反射技术和自定义特性就可以动态获取并实现。反射可以查询类型的成员,特性可以

对成员进行标注。有点儿复杂的示例就不写了!

无论你怎么写,对该方法不做绑定标记,恐怕不行!

"在方法中获取方法名"

有点儿让人费解,不知道你碰到了什么问题!

方法名在程序的什么地方都可以获取!只要你想

不知道,这是不是你想要的答案。

请注意看异常信息。未能从“当前”程序集获取“外部”程序集中拥有指定完整限定名的类型。

事实上,直接使用TypeGetType()会从当前程序集,也就是"test3"程序集中查找。

想要查找NHapiModelV23程序集中的类型,请在该程序集上使用GetType

Assembly asmNHapi=AssemblyLoadFrom();

Type outerType=asmNHapiGetType();

如果想尽量少的改动自己的代码也成,直接在你的var classes上进行linq查询就好。

Type[] classes=AssemblyLoadFrom()GetTypes();

Type tt=classesFirstOrDefault(t=>tFullName="NHapiModelV23GroupORM_001_"+properties[i]);

if(tt!=null)

    DoSomething();

最后提醒,请勿使用AssemblyLoad方法,因为该方法已被弃用,请使用LoadFrom和LoadFile来加载外部程序集。

此外,类型的完全限定名和短名并不影响类型的搜索。使用GetType时会从根命名空间开始一层一层查找的,如果各层命名空间下没有重名的类,你甚至没有使用完全限定名的必要。比如上面的代码里可以使用短名进行查找。

Type tt=classesFirstOrDefault(t=>tName="ORM_001_"+properties[i]);

刚看到上面的回答,这里我要肯定的告诉你,不管你是用文件方式还是项目引用方式,都不可能使用TypeGetType静态方法获取另一个程序集中的类型,必须在对方的程序集上进行查找!

如果你非要使用TypeGetType静态方法获取其他程序集中的类型,可以使用其的一种重载:

public static SystemType GetType(string typeName, SystemFunc<AssemblyName,Assembly> assemblyResolver, SystemFunc<Assembly,string,bool,Type> typeResolver)

该静态方法要求你提供自己的程序集名称解析器和类型名称解析器,非特殊情况不推荐使用。该方法是为了在多个程序集中同时查找多个类型而被微软提供的。

Java中要用到反射,首先就必须要获取到对应的class对象,在Java中有三种方法获取类对应的class对象。

1、通过类的class属性

2、通过类实例的getClass()方法获取

3、通过ClassforName(String className)方法获取

现在比如在package下有个类Calculator

public class Calculator{

public double add(double score1,double score2){

return score1 + score2;

}

public void print(){

Systemoutprintln("OK");

}

public static double mul(double score1,double score2){

return score1  score2;

}

}public class CalculatorTest {

public static void main(String[] args) throws Exception {

//通过类的class属性获取

Class<Calculator> clz = Calculatorclass;

//或者通过类的完整路径获取,这个方法由于不能确定传入的路径是否正确,这个方法会抛ClassNotFoundException

// Class<Calculator> clz = ClassforName("testCalculator");

//或者new一个实例,然后通过实例的getClass()方法获取

// Calculator s = new Calculator();

// Class<Calculator> clz = sgetClass();

//1 获取类中带有方法签名的mul方法,getMethod第一个参数为方法名,第二个参数为mul的参数类型数组

Method method = clzgetMethod("mul", new Class[]{doubleclass,doubleclass});

//invoke 方法的第一个参数是被调用的对象,这里是静态方法故为null,第二个参数为给将被调用的方法传入的参数

Object result = methodinvoke(null, new Object[]{20,25});

//如果方法mul是私有的private方法,按照上面的方法去调用则会产生异常NoSuchMethodException,这时必须改变其访问属性

//methodsetAccessible(true);//私有的方法通过发射可以修改其访问权限

Systemoutprintln(result);//结果为50

//2 获取类中的非静态方法

Method method_2 = clzgetMethod("add", new Class[]{doubleclass,doubleclass});

//这是实例方法必须在一个对象上执行

Object result_2 = method_2invoke(new Calculator(), new Object[]{20,25});

Systemoutprintln(result_2);//45

//3 获取没有方法签名的方法print

Method method_3 = clzgetMethod("print", new Class[]{});

Object result_3 = method_3invoke(new Calculator(), null);//result_3为null,该方法不返回结果

}

}

反射:在运行状态下,通过class文件对象,去使用构造方法,成员变量,成员方法

方法有三种:

1类名class

2对象getclass()

3classforName("包名类名")

好处:

只要有一个类或者一个类的对象,就可以得到这个类或对象的所有属性和方法,包括私有的

同步方法

反射成员方法:

1获取字节码文件

Class c = ClassforName("包名类名");

2反射方法

Method m = cgetMethod("反射的方法",方法的参数类型class);

3用方法,minvoke(对象,参数) 对象,cnewInstance ,在A建立对象。

minvoke(cnewInstance(),参数);

类加载器与反射有什么关系

反射是通过字节码文件对象,将类的字段,方法,构造器等映射成相应的类,并进行各自的 *** 作;

类加载器是通过某个类的classLoader()方法,将该类的class文件从硬盘中加载到java虚拟机中,形成字节码文件;

// 获得当前类名

String clazz = ThreadcurrentThread() getStackTrace()[1]getClassName();

// 获得当前方法名

String method = ThreadcurrentThread() getStackTrace()[1]getMethodName();

Systemoutprintln("class name: " + clazz + " Method Name " + method);

等你学过SSH之后你就明白为要用反射了,牛B的框架都是通过配置文件,即反射机制来做的

例如吧,你想把a对象放到b对象中,但是你并不知道B对象的方法名叫什么

,或者并不知道用户会将方法名定义成什么

这个时候,你只需要在配置文件中,或者是用注解,写上去那么通过反射就可以得到某个方法了

反射机制是比较高级的东西,你还是踏踏实实的吧,

就这么说你可以理解不了,也并不知道他的意义在哪,

只有等你接触的框架,代码多了自然会明白他的作用

以上就是关于如何根据方法名字符串反射执行该方法全部的内容,包括:如何根据方法名字符串反射执行该方法、C#如何在方法中获得方法名、C#通过反射获取不同命名空间下的类(属性和方法)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9624054.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存