绝大多数经典的JAVA框架均采用了JAVA的反射机制来实例化、维护JAVA对象。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制。
JAVA通常是先有类再有对象,类的对象可以调用方法或者属性。
反射其实是通过Class对象来调用类里面的方法。
通过反射可以调用私有方法和私有属性。
反射就是可以在程序运行的时候动态装载类,查看类的信息,生成对象,或操作生成对象。
类在运行的时候,可以得到该类的信息,并且可以动态的修改这些信息,自己能看到自己,跟照镜子一样。
JAVA的反射机制是在编译的时候并不确定哪个类被加载,而在程序运行的时候才加载、探知、自审、使用在编译期并不知道的类,这样的特点就是反射。
如果没有采用反射的机制,A类如果需要使用B类的方法,必须要求B类已经完成方法的编写(编译),否则A类无法通过编译。
而利用JAVA的反射机制,A类可以在未得到B类完成编译时能够完成自己身代码的编译。
JAVA的反射机制提供了这些能力:
JAVA的反射机制能够探知类的基本结构,这种能力被称为JAVA类的“自审”。
开发常用的eclipse和idea,当我们构建出一个对象的时候,去调用该对象的方法和属性的时候,一按点.编译工具就会将该对象可用的所有的方法和属性全部都列出来,供用户进行选择,就是利用了JAVA的反射原理,对创建的对象的探知、自审。
反射技术被大量用于JAVA设计模式和框架技术,最常见的设计模式就是工厂模式和单例模式。
反射的实现主要借助四个类:Class、Constructor、Field、Method
//获取Class类的三种方式
Class<User> userClass;
//.class
userClass = User.class;
//类名全路径
userClass = (Class<User>) Class.forName("com.mebugs.user");
//对象获取Class
User user = new User();
userClass = (Class<User>) user.getClass();
//Class获取对象
User tom = userClass.newInstance();
//Class类获取构造方法
Class<User> consClass = User.class;
//全部公共构造方法数组
Constructor<User>[] allPubCons = (Constructor<User>[]) consClass.getConstructors();
//根据入参获取指定公共构造方法
Constructor needPubCons = consClass.getConstructor(new Class[]{int.class,String.class});
//全部构造方法(包含私有)
Constructor<User>[] allCons = (Constructor<User>[]) consClass.getDeclaredConstructors();
//根据入参获取指定构造方法(包含私有)
Constructor needCons = consClass.getDeclaredConstructor(new Class[]{int.class,String.class});
//Class类获取属性
Class<User> fieldClass = User.class;
//获取指定的公共属性(类或接口的指定已声明字段类对象)
Field pubName = fieldClass.getField("name");
//获取全部公共属性(类或接口的指定已声明字段类对象)
Field[] allPubFiels = fieldClass.getFields();
//获取指定的属性(类或接口的指定已声明字段类对象)
Field name = fieldClass.getDeclaredField("name");
//获取全部属性(类或接口的指定已声明字段类对象)
Field[] allFiels = fieldClass.getDeclaredFields();
//Class类获取方法
Class<User> modClass = User.class;
//获取指定的公共方法
Method pubDo = modClass.getMethod("do",new Class[]{int.class,String.class});
//获取全部公共方法
Method[] allPubMo = fieldClass.getMethods();
//获取指定的方法
Method doMo = modClass.getDeclaredMethod("do",new Class[]{int.class,String.class});
//获取全部方法
Method[] allMo = fieldClass.getDeclaredMethods();
ClassForName与ClassLoader的区别:
当前还没有观点发布,欢迎您留下足迹!
Spring就像一个大家族,里面包含了很多衍生产品,其中最为出名的就是SpringMVC和SpringBoot,那么这三者之间是什么关系呢?SpringMVC和SpringBoot又专门用来做什么呢?
在JAVA的WEB工程中我们可以将JSP页面文件放在WEB-INFO中限制用户进行URL直接访问,但静态资源如js、css文件却是需要被外部直接访问的,直接对外暴露又不太安全,可以通过自定义过滤器处理
SpringMVC框架是围绕DispatcherServlet(前端控制器)展开的,本文描述SpringMVC的优点、各个核心类(角色)作用,并说明用户请求数据到最终视图返回完整的数据传输过程
SpringBoot 的 MyBatis 默认采用 hikari 连接池,druid (德鲁伊) 连接池由阿里开源,它不仅仅是一个连接池,更是代理、过滤器、解析器、插件、监控、优化等实用功能组件库,更在阿里生产环境得到验证,所以 Lets Do It
Struts2框架以WebWork优秀的设计思想为核心,吸收了 Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web应用程序框架,本文主要是与Spring整合关键配置和实例
scope属性主要用于控制依赖范围,主要分为编译、打包、运行、测试、依赖传递等各个常见,scope不同于optional提供了更多可选择的配置参数用于应对不同的依赖场景。