JAVA技术面试题一、什么是反射通过类说明可以得到这个类的所有方法、属性、构造子,可以invoke方法、修改属性值、设置属性值、通过构造子实例化一个新的对象二、得到说明的三种方式Class.forName();类名.class实例名.getClass();三、通过类说明得到类的名称、父类、实现的所有接口。Classclass=Class.forName();class.getName();class.getSuperClass().getName();class.getInterfaces();四、构造子(constructor)//非构造子Contructorcons=class.getConstructor(newClass[]{String.class,String.class});Objectobj=cons.newInstance(newObject[]{a,b});//默认构造子class.newInstance();四、方法Methodmethod=class.getMethod(方法名,newClass[]{String.class,Integer.class});method.invoke(实例,newObject[]{a,b});五、属性FieldcustomerName=class.getField(customerName);customerName.set(对象,值);customerName.get(对象);六、struts1.X核心类:M:modelFacade:业务处理dao:数据操作C:control系统给定:ActionServlet:接收所的有请求RequestProcessor:是ActionServlet的一个助手ActionMapping:说明url与action及actionForm的映射关系及具体页面的跳转ActionForward:转发到另一个页面需要开发人员继承并实现Action:具体业务处理V:viewActionForm:承载页面的信息注意:form的前两个字母一定要小写jsp:显示信息处理过程:1、通过url.do将请求发给ActionServlet2、ActionServlet接收请求并转发给RequestProcessor3、RequestProcessor根据url在struts-config.xml中找到对应的Action及ActionForm4、如果有Action用已有的,如果没有产生新的Action实例,即Action是一个单例5、如果在当前的作用域中有ActionForm,用已有的,没有产生一个新的实例,通过反射将表单中的值注入到ActionForm中调用Action的execute方法,在调用之前将ActionForm注入到execute方法中,execute方法在执行结束前通过ActionMapping找到ActionForward转发到另一个页面。七、hibernate1、为什么用hibernate让我们的工作量减少了95%2、核心类及接口1、核心类Configuration:加载配置文件,连接数据库,产生SesionFactory实例2、核心接口SessionFactory:手动一个application中只有单例,产生具体的sesion,二级缓存。Session:具体的会话,进行增、删、改、查一行数据一级缓存save(obj):增加delete(obj)update(obj)get(Class,主键值)/load(class,主键值)Query:查询或更新多行数据Queryquery=createQuery(fromCustomerwherecustomerName=:aandsex=:b);query.setString(a,张三);query.setString(b,男);//查询Listusers=query.list();//更新Queryquery=createQuery(update/delete);query.updateQuery();//注意Hql中的表名、列名必须是对象名、属性名Transaction:事务处理Transactiontrans=session.beginTransaction();trans.rollback();trans.commit();3、核心配置文件1、hibernate.cfg.xml说明数据库连接及具体的o/rMapping文件所在位置2、*.hbm.xml:具体的o/rMapping(objectrelationedmapping)说明文件说明类与表,属性与字段的对应关系八、singleton'sthreefeature1、constructor'smodifierisprivate2、hasastaticfield,thefield'sclassisitself3、hasastaticmethod,returnedtypeisitsellfifstaticfieldisnullproduceanewinstanceelsereturnfield'svaluesingleton'stype:1、lazy(懒汉式):直到用时才产生新的实例don'tproducenewinstanceutilusefield'svalue2、hungry:加载类时就产生新的实例loadclassproducenewinstance七、template父类即有抽象方法又有普通方法,抽象方法由子类实现,向客户公开的是子类,通过父类的普通方法调用子类实现的抽象方法,为子类提供服务。八、simplefactory有三个角色分别是工厂、抽象产品、具体产品工厂产生具体产品返回抽象产品,当增加新的产品时只需修改工厂,不用修改客户端,半符合开闭原则。如果用了返射只需修改配置文件,完全符合开闭原则。一、hibernateOneToMany通过get方法可以找到另一方:1、one(单表):通过get可以得到一个集合(Set,List)。publicclassCustomer{privateStringcustomerName;privateSetBuybuies;publicvoidsetBuies(SetBuybuies){this.buies=buies;}publicSetBuygetBuies(){returnthis.buies;}}2、many(多表):通过get可以得到一个one对象。publicclassBuy{privateCustomercustomer;publicvoidsetCustomer(Customercusotmer){this.customer=customer;}publicCustomergetCustomer(){returnthis.customer;}}inverse(主控方):维护many表外键列的值。inverse=false:代表是主控方。如果要维护外键列的值,必须将被控方作为其属性。inverse=true:代表是被控方。不管外键列的值。lazy(延迟):lazy=true:默认的方式,加载时只加载当前对象的值,不加载关联对象的值lazy=false:代表是即时加载,加载时不但加载当前对象的值,还加载关联对象的值。cascade(级联):cascade=all:主增从增、主删从删、主改从改cascade=delete-update:主增从增、主改从改总结:inverse(主控方):一般many作为主控方,one作为被控方。cascase:一般不用二、hibernate的生命周期1、自由(free):与session没有关系,通过get方法不可以取另一个对象的值Customercustomer=newCustomer();2、持久(persistent):由session管理1、通过get方法可以取出另一个对象的值。通过get、save、update、query.list()后的对象。Customercustomer=newCustomer();session.save/update(customer);customer=session.get/load(Classcls,primeryKey);2、在事务内,可以通过set方法修改3、如果已有一个持久对象,再通过save加入主键相同的对象时报错。3、游离():被session抛弃,通过get方法取不出另一个对象的值Customercustomer=session.get();session.close();三、spring的ioc(inverseofcontrol)/di(dependenceinjection)1、spring是一个超级工厂,可以产生任意类的实例四、spring的三种注入方式1、Set方法2、构造子3、接口五、方法:getBean(id);//产生个类实例,默认是单例模式六、bean对象的作用域singletonprototypesessionrequestglobalsession七、struts的Action的分类Action:一个类只能执行一个动作.(execute)DispatchAction:一个类可以有多个方法实现过程:1、extendsDispatchAction2、在action中加入parameter参数说明决定方法名的表单域名,客户提交后,通过该表单域的值确定DispatchAction的具体方法。actionparameter=表单域名/八、做的过程1、struts环境2、hibernate环境3、引入base、struts、hibernate包4、dao5、facade6、action7、jsp页面8、debug一、hibernte&dao&struts框架1、Mfacade1、facade如何实现dao1、dao框架实现2、hibernate核配置语件、类、接口3、hibernate中entity的生命周期4、hibernateOneToMany如何实现,有几个关键字,作用。5、simplefactory6、singlton7、template2、VC1、struts的核心类的作用,用VC的方式解说2、struts的请求处理过程3、struts的标签4、action的分类如何实现二、设计模式的原则、框架设计的原则一、hibernte&dao&struts框架1、Mfacade:业务实现,可以调用多个dao1、facade如何实现一个facade接口,一个实现类,一个工厂,工厂实例化具体的Facade,返回facade接口,用的是单例工厂中有一个静态私有的Facade接口属性,一个静态公有的方法,如果facade接口属性为空产生一个具体的Facade实例给静态接口属性,否则直接返回静态接口属性值。dao:当持久层发生变化时,不用修改facade,只需加入一个dao的实例类,一个具体的dao工厂,修改配置文件指定具体的dao工厂。1、dao框架实现a、角色及关系抽象的dao接口具体的dao实现,实现抽象的dao接口抽象的dao工厂具体的dao工厂,继承于抽象的dao工厂b、动态关系客户端调用抽象的dao工厂的方法,该方法读取配置文件,得到具体dao工厂类名及路径,通过反射产生具体的dao工厂实例,返回抽象的dao工厂,但调用的还是具体dao工厂实例的方法,产生具体的dao实例,返回抽象dao接口。2、hibernate核配置文件、类、接口a、配置文件hibernate.cfg.xml:说明数据库连接、*.hbm.xml文件所在位置、设置show_sql显示sql*.hbm.xml:说明类与表,字段与属性、oneToMany、ManyToOne、主键的生成方式(assigned、native、identity)b、类及接口:类:Configurationconfig=newConfiguration().configure();//加载hibernate.cfg