浅谈“反射”在java及.net技术中的运用
.jpg)
作者:北大青鸟南京中博-张宪芝 南京航空航天大学计算机技术研究生,曾前往德国交流,多年高校及软件开发公司工作经验。
S2第二门课程<<深入.NET平台和C#编程>>中提及到反射的概念,但内容单薄,在这里稍许补充些相关内容,以便于同学们学习。
一、Java反射:
我们先来看看在java中是如何做到反射的:
反射的条件,首先要有对象。有两个步骤,1.加载类,2.产生对象
package com.zbitedu.utility;
public class Student {
public String sayHello(String s) {
return s+",Hello";
}
}
package com.zbitedu.utility;
import java.lang.reflect.Method;
public class ReflectionTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String className="com.zbitedu.utility.Student";
try {
Class class1=Class.forName(className);//加载类
//不知道类如何构造,用下面方法
Object object=class1.newInstance();
Method method=class1.getMethod("sayHello", String.class);//获取方法
String string =(String)method.invoke(object, new Object[]{"zbitedu"});//执行方法
System.out.println(string);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
输出为zbitedu,Hello
既然在class中有getMethod方法,肯定还有getFiled等等方法,大家可以自己去扩展。我们还可以根据getConstructor构造方法来创造实例。
二、C#反射
其实和Java没有多大区别,做代码如下:
namespace ReflectionTest
{
class Student
{
public string SayHello(string s)
{
return s + ",Hello";
}
}
}
namespace ReflectionTest
{
class Program
{
static void Main(string[] args)
{
Type t = Type.GetType("ReflectionTest.Student");
Assembly ass = Assembly.GetAssembly(t);//相当于Java中的加载
object obj = ass.CreateInstance("ReflectionTest.Student");
MethodInfo m = t.GetMethod("SayHello");
string s=(string)m.Invoke(obj,new object[] {"zbitedu"});
Console.WriteLine(s);
}
}
}
总结:
两种语言在互相学习,互相COPY,反射思路一样的。只不过在JAVA中,用的是CLASS,而C#用的是TYPE。 |