• Java常用--反射


          反射的意义

        你可能说,平时都是业务的增删查改基本用不到反射。但是如果你学会用反射了,可以减少重复代码,非常的好用。

                反射是Java语言的一大特性,允许动态的修改程序行为。

          代码说反射

                   1、反射的三个入口

       try {
                Class<?> perClazz = Class.forName("reflector.Person");
                System.out.println(perClazz);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    
            Class<?> perClass1 = Person.class;
            System.out.println(perClass1);
    
            Person person = new Person();
            Class<?> perClass2 = person.getClass();
            System.out.println(perClass2);

         2、反射的基本操作

          //反射调用静态方法。
            try {
                Class<?> perClass=Class.forName("reflector.Person");
                Method method = perClass.getMethod("staticMethod",String.class);
                method.invoke(perClass.newInstance(),"zhangzhen");
            } catch (Exception e) {
                e.printStackTrace();
            }
            //反射创建对象
            try {
                Class<?> perClass=Class.forName("reflector.Person");
               Person person=(Person)perClass.getConstructor().newInstance();
               person.setAge(1);
                System.out.println(person.getAge());
            } catch (Exception e) {
                e.printStackTrace();
            }
            //反射调用实例方法
            try {
                Class<?> perClass=Class.forName("reflector.Person");
                Method method = perClass.getMethod("interfaceMethod");
                method.invoke(perClass.newInstance());
            } catch (Exception e) {
                e.printStackTrace();
            }
            //反射调用私有方法
            try {
                Class<?> perClass=Class.forName("reflector.Person");
    
                //再次说明,你要调用私有的方法,一定要用这个getDeclaredMethod ,因为只有这个才是没有访问权限的控制。
                Method method = perClass.getDeclaredMethod("privateMethod");
                method.setAccessible(true);
                method.invoke(perClass.newInstance(),null);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //反射调用重载方法
            try {
                Class<?> perClass=Class.forName("reflector.Person");
                //反射调用重载方法的时候,主要是由声明时候的参数类型决定的,和你具体传值是无关的。
                Method method = perClass.getDeclaredMethod("SayHello",int.class);
                method.setAccessible(true);
                method.invoke(perClass.newInstance(),Integer.valueOf(300));
            } catch (Exception e) {
                e.printStackTrace();
            }
    
           // 反射越过泛型检查 ;
            try {
                ArrayList<Integer> arrayList = new ArrayList<Integer>();
                arrayList.add(2);
                arrayList.add(3);
                Method method= arrayList.getClass().getMethod("add", Object.class);
                method.invoke(arrayList,"test");
                for (int i = 0; i <arrayList.size() ; i++) {
                    System.out.println(arrayList.get(i));
                }
            }catch (Exception ex){
                System.out.println(ex.getMessage());
            }
            
            //反射动态加载
            Properties properties = new Properties();
            System.out.println(System.getProperty("user.dir"));
            properties.load(new FileReader("1.txt"));
            String className=properties.getProperty("ClassName");
            String methodName=properties.getProperty("MethodName");
            try {
                Class<?> perClass = Class.forName(className);
                //反射调用重载方法的时候,主要是由声明时候的参数类型决定的,和你具体传值是无关的。
                Method method = perClass.getDeclaredMethod(methodName);
                method.setAccessible(true);
                method.invoke(perClass.newInstance());
            } catch (Exception e) {
                e.printStackTrace();
            }     

          反射的应用

       1、IDE里面的智能提示,通过反射实现。

       2、框架中,也离不开反射(ORM,IOC等等)

          3、平时写一些ConvertDTO也会用到反射

          4、做一些插件式开发也会用到反射  

        

          

  • 相关阅读:
    java学习day16--常用类之包装类
    String、StringBuffer、StringBuilder的异同
    java学习day15--常用类之字符串相关的类
    java学习day15--Arrays工具类
    java学习day14--二维数组
    java学习day14--可变长参数
    java学习day13--数组
    java学习day13--自定义异常类
    java学习day12--异常
    接口和抽象类的异同
  • 原文地址:https://www.cnblogs.com/gdouzz/p/13155704.html
Copyright © 2020-2023  润新知