
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#通过反射获取不同命名空间下的类(属性和方法)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)