• Java泛型与反射的综合应用


    前一段时间,项目之余没有事情做,于是就学习了一下基础的泛型与反射。现记录如下:

    首先,应当掌握的知识:

    1)方法的动态参数:

    不确定方法中参数的个数,就可以采用以下方法定义一个动态参数的方法

     示例:

    public class testA {

      public static void parameters(String str,Object... objects ){
        System.out.println("以下是动态参数方法中的"+objects.length+"个参数");
        for(Object obj:objects){
          System.out.println("不定参数:"+obj);
        }
      }

      public static void main(String[] args) {
        parameters("中国人", "中国",1000,23.56f,"万里长城");
      }
    }

    结果:

      以下是动态参数方法中的4个参数
      不定参数:中国
      不定参数:1000
      不定参数:23.56
      不定参数:万里长城

    2)泛型

    泛型主要分为:泛型类、泛型接口、泛型方法

    泛型类:

    public class Message<T> {
      private T classes;

      public T getClasses() {
        return classes;
      }

      public void setClasses(T classes) {
        this.classes = classes;
      }
    }

    泛型方法:以下泛型泛型方法引用到上面的泛型类。

    public static Message<?> genericMethod(){
      Message<Integer> msg =new Message<>();
      msg.setClasses(77);
      return msg;
    }
    public static void main(String[] args) {
      Message<?> msg=genericMethod();
      Object obj=msg.getClasses();
      System.out.println("类型:"+obj.getClass().getName()+";值为:"+obj);
    }

    结果:

    类型:java.lang.Integer;值为:77

    3)反射

    使用反射可以得到一个类的方法以及类的参数

    public class reflect {
      public String test1(){
        System.out.println("Test1");
        return "Test1";
      }
      public String test2(String st){
        System.out.println("Test2:"+st);
        return "Test2"+st;
      }
      public Float test3(Float fl){
        System.out.println("Test3:"+fl);
      return fl;
      }
      private String test4(Float fl,String st){
        System.out.println("Test4:"+fl);
        return st+" 4 "+fl;
      }

    }

    public static void main(String[] args) throws Exception {
      reflect ref = new reflect();
      Method[] methods =ref.getClass().getDeclaredMethods();
      for(Method method:methods){
        System.out.println("方法名:"+method);
      }
    }

     使用getDeclaredMethods()方法可以得到所有的方法(不管私有公有方法),也可以getMethods()只得到公有方法

    结果:

      方法名:public java.lang.String myproject.reflect.test1()
      方法名:public java.lang.String myproject.reflect.test2(java.lang.String)
      方法名:public java.lang.Float myproject.reflect.test3(java.lang.Float)
      方法名:private java.lang.String myproject.reflect.test4(java.lang.Float,java.lang.String)

    执行其他类的方法,当执行其他类私有方法时,需要调用setAccessible(true)方法抑制Java的访问控制检查

    public static void main(String[] args) throws Exception {
      reflect ref = new reflect();
      Method[] methods =ref.getClass().getMethods();
      Method m1=null;
      m1=ref.getClass().getDeclaredMethod("test4",Float.class,String.class);
      m1.setAccessible(true);
      Object bean = ref.getClass().newInstance();
      Object heInteger = m1.invoke(bean,23.45f,"hello,反射方法");
    }

    结果:

    Test4:23.45

     ---------------------------------------------------------------------------------------------------------

    以上就是一些关于泛型,反射的基本知识,下面将综合利用这两个知识点,来创建一个方法:该方法的功能是可以调用任何类的方法,并返回该类的返回值以及返回值的类型。

    1.泛型代码如下:

    public class Message<T> {
      private T classes;

      public T getClasses() {
        return classes;
      }

      public void setClasses(T classes) {
        this.classes = classes;
      }
    }

    2.该方法代码如下:

    public final class Generic {
      public static Message<?> hello(Object obj,String tag,Object...objects) throws Exception{
        Class<?> clazz=null;
        if(obj instanceof Class){
          clazz = (Class<?>)obj;
        } else{
          clazz = obj.getClass();
        }
        Method[] methods = clazz.getDeclaredMethods(); //获取该类文件的所有方法
        Method m1=null;
        for(Method method:methods){
          Class<?>[] classes =method.getParameterTypes();
          if(method.getName().equals(tag)){
            m1 = clazz.getDeclaredMethod(tag, classes);
            m1.setAccessible(true); // 抑制Java的访问控制检查
          }
        }
        Object bean = clazz.newInstance();
        Object heInteger = m1.invoke(bean,objects);
        Message<Object> msg =new Message<>();
        msg.setClasses(heInteger);
        return msg;
      }

    }

    3.要调用的类中的方法如下:

    public class Haha {
      public String test1(){
        System.out.println("Test1");
        return "Test1";
      }
      public String test2(String st){
        System.out.println("Test2:"+st);
        return "Test2"+st;
      }
      public Float test3(Float fl){
        System.out.println("Test3:"+fl);
        return fl;
      }
      public String test4(Float fl,String st){
        System.out.println("Test4:"+fl);
        return st+" 4 "+fl;
      }

    }

    4.通过该方法调用上面类的方法:

    public static void main(String[] args) throws Exception {
      Message<?> message =Generic.hello(new Haha2(),"test1",23.23f,"hahaaaaaaa");
      message.getClasses();
      System.out.println("返回值类型:"+message.getClasses().getClass().getName()+";返回值:"+message.getClasses());
    }

    结果:

    Test1:23.23
    返回值类型:java.lang.String;返回值:hahaaaaaaa 4 23.23

  • 相关阅读:
    202011051 每周例行报告
    202011261 每周例行报告
    202010153 每周例行报告
    keil代码定位
    VC2008创建MFC工程遇到的问题及解决方法
    面朝大海, 春暖花
    Oracle10G数据库教程
    郁闷来了
    MPEG4与.mp4
    vs2003 使用ffmpeg,sdl时的编译问题
  • 原文地址:https://www.cnblogs.com/momoweiduan/p/8313109.html
Copyright © 2020-2023  润新知