程序运行时,允许改变程序结构或变量类型的语言。有Python、Ruby等。
显然C++,Java,C#不是动态语言。
比如 JS
``java var i = 1;// int 类型 i = "a" ; //String类型在运行状态,可以知道任意类或对象的属性和方法,一种动态调用方法和动态获取信息的机制。
是java非常突出的动态相关机制:Reflection。
很多优秀的开源框架都是通过反射完成的。
可以实现的功能
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象; `
Class.forName(权限定路径).newInstance() // newInstance()默认调用空`构造方法 限权定路径:包名.类名在运行时判断任意一个类所具有的成员变量和方法;
通过reflect中的一些isXXX的方法判断在运行时调用任意一个对象的方法;
获得对象之后通过对象.getMethod()方法/getMethods() /getDeclaredMethod()/ getDeclaredMethods()(可获取private的方法) 获得方法后使用invoke(参数列表)调用方法。 Method method2 = cls.getDeclaredMethod("setName", String.class); //调用方法 method2.invoke(user,"suoyi"); 面对私有方法,可以进行访问权限的设置 /私有方法 //方法忽略权限问题 methods.setAccessible(true); methods.invoke(user); setAccessible(true); setAccessible(false); //在无法访问private修饰的方法时,考虑设置权限为True,用完记得归位。 操作属性 //创建对象 User user = cls.getConstructor(int.class,String.class,String.class).newInstance(1002,"yinwei","4321"); //获取属性 Field field = cls.getDeclaredField("id"); //私有属性权限问题 field.setAccessible(true); //设置值 field.set(user,2000); //获取值 System.out.println(field.get(user)); System.out.println(Modifier.toString(field.getModifiers())); //Modifier.toString(field.getModifiers()),获取属性的访问修饰编号,并将编号转换成修饰符 操作数组 //创建数组 String[] arr = (String[]) Array.newInstance(String.class,5); System.out.println(arr.getClass().isArray()); //设置值 Array.set(arr,0,"胡歌"); //获取值 System.out.println(Array.get(arr,0)); System.out.println(Arrays.toString(arr)); 生成动态代理; 会从接下来的学习中继续补充哦! 如果觉得小编的分享对您有帮助,请给我来个赞并收藏一下吧!