Hus*_*awi 22 java generics reflection
如何通过java中的反射调用自定义通用方法?
class Person
{
public <T> void print(T t)
{
System.out.println(t.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
Edw*_*uck 22
泛型在编译时被擦除,它们仅向编译器提供额外信息以确定错误.它们实际上并没有更改.class
文件中方法的签名.
这意味着您通过Java中的反射调用泛型方法的方式与在Java中调用非泛型方法完全相同,除了不指定类型T
,您可以指定类型Object
.
关于如何通过反射调用常规方法有很多教程,我不愿意添加另一个; 但是,如果您真的需要关于如何通过反射调用方法的指导,请在下面添加注释,我将添加必要的代码.
如果发现事情没有按预期工作,则可以始终javap
在已编译的类文件上运行,以验证您是否在参数列表中使用了正确的对象.如果指定<T extends List>
类型通用签名,则生成的参数对象可能实际上可能是List
对象.
ada*_*shr 10
这适合我.
Method method = Person.class.getMethod("print", Object.class);
method.invoke(new Person(), "this is a string");
method.invoke(new Person(), 273);
method.invoke(new Person(), new Object());
Run Code Online (Sandbox Code Playgroud)
印花
this is a string
273
java.lang.Object@addbf1
Run Code Online (Sandbox Code Playgroud)
当然,在@ Edwin的回答中,这背后的理论得到了很好的解释.
为了强调 Edwin 的回答中给出的观点,我们在泛型类型中使用 extends :如果你有一个类
GenericHibernateDao<T extends Serializable>
Run Code Online (Sandbox Code Playgroud)
,和一个方法
public T save( T entity ) {};
Run Code Online (Sandbox Code Playgroud)
要使用反射调用保存方法,您必须使用 Serializable 类,即,您需要使用:
Method method = GenericHibernateDao.class.getMethod(methodName, Serializable.class);
Run Code Online (Sandbox Code Playgroud)
而不是 Object.class 作为参数,因为我们正在使用
<T extends Serializable>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11014 次 |
最近记录: |