如何获得当前类的字段,方法参数泛型的类型

如何获得当前类的字段,方法参数泛型的类型,第1张

获得方法的代码如下,字段的类似

/

  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集合里面的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/9761702.html

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

发表评论

登录后才能评论

评论列表(0条)

保存