获得方法的代码如下,字段的类似
/Project Name [online-courses]
File Name [day02genericGenericDemo5java]
Creation Date [2016-11-23]
<p>
Copyright© 2016 geyyang@hotmailcom All Rights Reserved
<p>
Work hard, play harder, think big and keep fit
/
package day02generic;
import javalangreflectMethod;
import javalangreflectParameterizedType;
import javalangreflectType;
import javautilList;
/
泛型示例-使用反射获取泛型类型<br />
@author <a href="mailto:geyyang@hotmailcom">杨舸</a>
@version 100
@since jdk 18
/
public final class GenericDemo5 {
public void testGenericReflection(List<String> list) {
}
/
测试方法<br />
@param args 命令行参数
@throws Exception 抛出的异常
/
public static void main(String[] args) throws Exception {
Method method = GenericDemo5classgetMethod("testGenericReflection", Listclass);
Type[] parameterTypes = methodgetGenericParameterTypes();
ParameterizedType parameterType = (ParameterizedType) parameterTypes[0]; // 获得第一个泛型参数, Collection类型的集合只有一个泛型参数, Map类型的集合有两个泛型参数
Systemoutprintln(parameterTypegetRawType()); // interface javautilList
Systemoutprintln(parameterTypegetTypeName()); // javautilList<javalangString>
Systemoutprintln(parameterTypegetActualTypeArguments()[0]); // class javalangString
}
}
首先来个不安全的,但是短的版本:
foreach (object obj in mainList){
dynamic x = obj;
foreach (var item in x)
{
ConsoleWrite(item);
}
}
因为这些类型没有公共的接口(object不算),所以比较安全的方式是用if else处理了,用Type就够了。
foreach (object obj in mainList){
Type objType = objGetType();
if (objType == typeof(List<int>))
{
List<int> o = obj as List<int>;
foreach (var i in o)
ConsoleWrite(i);
}
else if (objType == typeof(List<string>))
{
List<string> o = obj as List<string>;
foreach (var s in o)
ConsoleWrite(s);
}
else if (objType == typeof(double[]))
{
double[] o = obj as double[];
foreach (var d in o)
ConsoleWrite(d);
}
else if (objType == typeof(Dictionary<string, int>))
{
Dictionary<string, int> o = obj as Dictionary<string, int>;
foreach (var p in o)
ConsoleWrite(p);
}
}
list里面的元素是set的话。就这样遍历:
<s:iterator value="list" var="x">
<s:iterator value="#x" var="y">
<>
</s:iterator>
</s:iterator>
泛型主要是加入了一个类型参数的概念。这个类型参数可以运用在类,接口,方法,委托等地方。意义是:比如我有一个类,里面有一个成员的类型我不确定。它可能可以是任意类型,在没有泛型的情况下,我们会把这个成员设置成object类型的成员。问题是,在使用这个成员是我需要做类型转换,这样就有性能损失。而泛型可以在编译是根据类型参数的值确定这个成员的类型。比如下面代码
namesapce MyTest
{
//<T>中的T可以写成任意的名称T不是保留字
public class TestClass<T>
{
T m_Data;//这里T表示m_Data的类型,它将在编译时由其他代码决定
public TestClass<T>(T data)
{
m_Data=data;
}
}
public class TestProgram
{
/下面代码中TestClass类的T参数分别被设置成int,string,object和float,所有用到参数T的地发都将被实际的类型所替代
/
public TestClass<int> intData;
public TestClass<string> stringData;
public TestClass<object> objectData;
public TestClass<float> floatData;
public TestProgram()
{
intData=new TestClass<int>(1);
stringData=new TestClass<string>("Test");
objectData=new TestClass<object>("someData");
floatData=new TestClass<float>(13f);
}
}
}
以上就是泛型最简单的应用。关于list<>的用法和上面相同。不过泛型的类型参数在实际应用中一般是要用where关键字加约束的。具体可以参考msdn
一般可以使用反射来获取泛型参数的实际类型,以下是详细代码:
import javalangreflectField;
import javalangreflectParameterizedType;
import javalangreflectType;
import javautilMap;
public class GenericTest {
/使用反射来获取泛型信息/
private Map<String, Integer> score;
public static void main(String[] args) throws SecurityException, NoSuchFieldException {
//Class clazz = GenericTestclass;
Class<GenericTest> clazz = GenericTestclass;
//Systemoutprintln(clazz);
Field f = clazzgetDeclaredField("score");
//直接使用getType只对普通类型有效,无法取到泛型参数
Class<> a = fgetType();
Systemoutprintln("score的类型是:"+a);
//获得Field实例f的泛型类型
Type gType = fgetGenericType();
//如果gType类型是ParameterizedType的对象
if (gType instanceof ParameterizedType) {
ParameterizedType pType = (ParameterizedType) gType;
//获取原始类型
Type rType = pTypegetRawType();
Systemoutprintln("原始类型是:"+rType);
//取得泛型类型参数
Type[] tArgs = pTypegetActualTypeArguments();
Systemoutprintln("泛型类型是:");
for (int i = 0; i < tArgslength; i++) {
Systemoutprintln("第"+i+"个泛型类型是:"+tArgs[i]);
}
}else{
Systemoutprintln("获取泛型类型出错!");
}
}
}
输出结果如下:
score的类型是:interface javautilMap
原始类型是:interface javautilMap
泛型类型是:
第0个泛型类型是:class javalangString
第1个泛型类型是:class javalangInteger
可以使用java的反射机制
比如,如果要获取List中第一个元素的对象类型可以这样
listget(0)getClass()getName();返回类型名
存放的是object类型也可以通过这种方法得到其真正的类型。
object类型存放的类型可以知道
以上就是关于如何获得当前类的字段,方法参数泛型的类型全部的内容,包括:如何获得当前类的字段,方法参数泛型的类型、请教C#中通过反射获得泛型集合中所有值的问题。、struts2<s:iterator>遍历一个list泛型,页面如何获取list泛型里一个set集合里面的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)