Java基础之—反射(五)

举报
brucexiaogui 发表于 2021/12/29 23:46:10 2021/12/29
1k+ 0 0
【摘要】 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

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

    全部回复

    上滑加载中

    设置昵称

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

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

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