Java基础之—反射(五)

举报
brucexiaogui 发表于 2021/12/29 23:46:10 2021/12/29
【摘要】 Java基础之—反射(五) 一、概述 通过反射创建的具体类的对象调用类的方法。 二、调用方法 import java.lang.reflect.Array;import java.lang.reflect.Method; class Dept{ public String[] publicMethod(String name)...

Java基础之—反射(五)

一、概述

通过反射创建的具体类的对象调用类的方法。

二、调用方法


  
  1. import java.lang.reflect.Array;
  2. import java.lang.reflect.Method;
  3. class Dept{
  4. public String[] publicMethod(String name){
  5. //return name +" 恭喜发财";
  6. return new String[]{name};
  7. }
  8. private void privateMethod(){
  9. System.out.println("show");
  10. }
  11. public static void staticMethod(){
  12. System.out.println("staticMethod");
  13. }
  14. }
  15. public class InvokeMethdod {
  16. public static void main(String[] args) throws Exception {
  17. //使用反射来调用Dept里的法
  18. Class<Dept> clz = Dept.class;
  19. //public void publicMethod(String name)
  20. //先得到这个需要被调用的方法
  21. Method m = clz.getMethod("publicMethod", String.class);
  22. /**
  23. * Object invoke(Object obj, Object... args) 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
  24. * 参数:
  25. obj - 从中调用底层方法的对象
  26. args - 用于方法调用的参数
  27. 返回:
  28. 使用参数 args 在 obj 上指派该对象所表示方法的结果
  29. */
  30. System.out.println(m);
  31. //Object ret = m.invoke(clz.newInstance(), "will");//YES
  32. Object ret = m.invoke(clz.newInstance(), new Object[]{"Will"});
  33. Class c = ret.getClass();
  34. String[] sArr = (String[]) ret;
  35. System.out.println(Array.getLength(sArr));
  36. //System.out.println("ret= " + ret.getClass().getComponentType());
  37. //===================
  38. //private void privateMethod()
  39. m = clz.getDeclaredMethod("privateMethod");
  40. //调用之前设置可访问的
  41. m.setAccessible(true);
  42. m.invoke(clz.newInstance());
  43. // public static void staticMethod()
  44. /**
  45. * 如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
  46. 如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null或不写
  47. *
  48. */
  49. m = clz.getMethod("staticMethod");
  50. //m.invoke(null);//YES
  51. //m.invoke(null, null);//YES
  52. m.invoke(null,new Object[]{});//YES
  53. }
  54. }

三、调用可变参数方法


  
  1. import java.lang.reflect.Method;
  2. public class InvokeMethodByVarArgsDemo {
  3. public static void show(int ...is){
  4. System.out.println("基本类型执行过来");
  5. }
  6. public static void show(String ...sArr){
  7. System.out.println("引用类型执行过来");
  8. }
  9. public static void main(String[] args) throws Exception {
  10. Class<InvokeMethodByVarArgsDemo> clz =InvokeMethodByVarArgsDemo.class;
  11. //调用public void show(int ...is)
  12. Method m = clz.getMethod("show", int[].class);
  13. //m.invoke(null,1,2,3);//ERROR
  14. m.invoke(null,new int[]{1,2,3});//YES
  15. m.invoke(null,(Object)new int[]{1,2,3});//YES
  16. m.invoke(null,new Object[]{new int[]{1,2,3}});//YES
  17. //public static void show(String ...sArr)
  18. m = clz.getMethod("show", String[].class);
  19. //m.invoke(null, "A","B","C");//ERROR
  20. //m.invoke(null, new String[]{"A","B","C"});//ERROR
  21. //m.invoke(null, (Object)new String[]{"A","B","C"});//装包 YES
  22. m.invoke(null, new Object[]{new String[]{"A","B","C"}});//装包 YES
  23. /**
  24. * public Object invoke(Object obj,Object... args)
  25. *
  26. * new Object[]{传递的实际参数};通用做法;
  27. */
  28. }
  29. }

四、调用泛型方法


  
  1. import java.lang.reflect.Method;
  2. import java.util.List;
  3. public class GenericMethodInvokeDemo {
  4. public static <T extends Number> List<T> asList(T... a) {
  5. System.out.println("执行");
  6. return null;
  7. }
  8. public static void main(String[] args) throws Exception {
  9. // 执行public static <T> List<T> asList(T... a)
  10. Class<GenericMethodInvokeDemo> clz = GenericMethodInvokeDemo.class;
  11. Method[] ms = clz.getDeclaredMethods();
  12. for (Method method : ms) {
  13. System.out.println(method);
  14. }
  15. //public static java.util.List pm.GenericMethodInvokeDemo.asList(java.lang.Object[])
  16. //T在这里应该制定其 极限(上限线或下限)
  17. Method m = clz.getMethod("asList", Number[].class);
  18. //m.invoke(null, new Object[]{new String[]{"A","B"}});
  19. m.invoke(null, new Object[]{new Integer[]{1,23}});
  20. }
  21. }

 

文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。

原文链接:brucelong.blog.csdn.net/article/details/95520885

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。