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可以这么搞:
Assembly asm = AssemblyLoad("UITestDesignTools10");//加载反射的dll
List<类型> list = new List<类型>();
Object[] parameters = new Object[2];//这里存放参数,有几个参数那么数组就定义几个
parameters[0] =list ;//给第一个参数赋值
parameters[1] = 123456 ;//给第2个参数赋值
Object instanceObj = asmCreateInstance("WindowsFormsfrmControlStyle", true, SystemReflectionBindingFlagsDefault, null, parameters, null, null); //反射获取指定类的对象
Form f = instanceObj as Form;
fShow()
上面这样就已经在反射对象的时候传参了。这里是给构造方法传参,
如果是给类里面的方法传参,看下面的
------------------------------------------------分割线----------------------------------------------------------
如果非要用invoke的话,稍改动一下
Type testClassType = TypeGetType( "TestTestClass", false );
if ( testClassType != null )
{
object instance = ActivatorCreateInstance( testClassType, 10, 20 );
MethodInfo test1 = testClassTypeGetMethod( "Test1", BindingFlagsInstance | BindingFlagsPublic );
List<类型> list = new List<类型>();
Object[] parameters = new Object[2];//这里存放参数,有几个参数那么数组就定义几个
parameters[0] =list ;//给第一个参数赋值()
parameters[1] = 123456 ;//给第2个参数赋值
test1Invoke( instance, parameters );
}
获得方法的代码如下,字段的类似
/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
}
}class Bh后面加个<L>是 泛型的标志,也可以是其它任何的大写字母,M,N,T都行,表示Bh 这个类的一系列类型;
比如说有个class 为Color<C>,此处的<C>为一种类型,如果没有<C>,表示,只能new Color();有泛型后,你可以new Color<Red> 或 new Color<Blue> 等等一系列类型;Method m = clazzgetDeclaredMethod("methodCompareCommon", Listclass, Objectclass, Objectclass, Objectclass);
直接这样就可以反射到你的方法,而且调用时,minvoke()里面的参数也全是Object的。你要想实现多态的话,那你要传的参数是继承自最顶层的Object了,那就必须得判断了,如果是你自己的一个类的话,就直接可以把父类对象当成方法的参数,然后可以传子类的对象
这是一个泛型方法,返回值是Class<T>类型的
看看这个>
返回值类型是Class类型
var listOfAType = listTypeMakeGenericType(new[] { aGetType() });
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)