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、做一些插件式开发也会用到反射  

 

    

      

posted @ 2020-06-18 13:59  GDOUJKZZ  阅读(232)  评论(0编辑  收藏  举报