反射的意义
你可能说,平时都是业务的增删查改基本用不到反射。但是如果你学会用反射了,可以减少重复代码,非常的好用。
反射是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、做一些插件式开发也会用到反射