Java基础之—反射(五)
【摘要】
Java基础之—反射(五)
一、概述
通过反射创建的具体类的对象调用类的方法。
二、调用方法
import java.lang.reflect.Array;import java.lang.reflect.Method; class Dept{ public String[] publicMethod(String name)...
Java基础之—反射(五)
一、概述
通过反射创建的具体类的对象调用类的方法。
二、调用方法
import java.lang.reflect.Array;
import java.lang.reflect.Method;
class Dept{
public String[] publicMethod(String name){
//return name +" 恭喜发财";
return new String[]{name};
}
private void privateMethod(){
System.out.println("show");
}
public static void staticMethod(){
System.out.println("staticMethod");
}
}
public class InvokeMethdod {
public static void main(String[] args) throws Exception {
//使用反射来调用Dept里的法
Class<Dept> clz = Dept.class;
//public void publicMethod(String name)
//先得到这个需要被调用的方法
Method m = clz.getMethod("publicMethod", String.class);
/**
* Object invoke(Object obj, Object... args) 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
* 参数:
obj - 从中调用底层方法的对象
args - 用于方法调用的参数
返回:
使用参数 args 在 obj 上指派该对象所表示方法的结果
*/
System.out.println(m);
//Object ret = m.invoke(clz.newInstance(), "will");//YES
Object ret = m.invoke(clz.newInstance(), new Object[]{"Will"});
Class c = ret.getClass();
String[] sArr = (String[]) ret;
System.out.println(Array.getLength(sArr));
//System.out.println("ret= " + ret.getClass().getComponentType());
//===================
//private void privateMethod()
m = clz.getDeclaredMethod("privateMethod");
//调用之前设置可访问的
m.setAccessible(true);
m.invoke(clz.newInstance());
// public static void staticMethod()
/**
* 如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null或不写
*
*/
m = clz.getMethod("staticMethod");
//m.invoke(null);//YES
//m.invoke(null, null);//YES
m.invoke(null,new Object[]{});//YES
}
}
三、调用可变参数方法
import java.lang.reflect.Method;
public class InvokeMethodByVarArgsDemo {
public static void show(int ...is){
System.out.println("基本类型执行过来");
}
public static void show(String ...sArr){
System.out.println("引用类型执行过来");
}
public static void main(String[] args) throws Exception {
Class<InvokeMethodByVarArgsDemo> clz =InvokeMethodByVarArgsDemo.class;
//调用public void show(int ...is)
Method m = clz.getMethod("show", int[].class);
//m.invoke(null,1,2,3);//ERROR
m.invoke(null,new int[]{1,2,3});//YES
m.invoke(null,(Object)new int[]{1,2,3});//YES
m.invoke(null,new Object[]{new int[]{1,2,3}});//YES
//public static void show(String ...sArr)
m = clz.getMethod("show", String[].class);
//m.invoke(null, "A","B","C");//ERROR
//m.invoke(null, new String[]{"A","B","C"});//ERROR
//m.invoke(null, (Object)new String[]{"A","B","C"});//装包 YES
m.invoke(null, new Object[]{new String[]{"A","B","C"}});//装包 YES
/**
* public Object invoke(Object obj,Object... args)
*
* new Object[]{传递的实际参数};通用做法;
*/
}
}
四、调用泛型方法
import java.lang.reflect.Method;
import java.util.List;
public class GenericMethodInvokeDemo {
public static <T extends Number> List<T> asList(T... a) {
System.out.println("执行");
return null;
}
public static void main(String[] args) throws Exception {
// 执行public static <T> List<T> asList(T... a)
Class<GenericMethodInvokeDemo> clz = GenericMethodInvokeDemo.class;
Method[] ms = clz.getDeclaredMethods();
for (Method method : ms) {
System.out.println(method);
}
//public static java.util.List pm.GenericMethodInvokeDemo.asList(java.lang.Object[])
//T在这里应该制定其 极限(上限线或下限)
Method m = clz.getMethod("asList", Number[].class);
//m.invoke(null, new Object[]{new String[]{"A","B"}});
m.invoke(null, new Object[]{new Integer[]{1,23}});
}
}
文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。
原文链接:brucelong.blog.csdn.net/article/details/95520885
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)