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)