1.Java创建对象有哪几种方式
Java创建对象的方式在使用技术上可以大体分为4种
- 使用new关键字创建对象
这个是我们常用的创建对象的方式,通过new 类名()可以调用此类的构造函数(无参和有参)。这种方式,类的生命周期中的加载、初始化、实例化三个操作都会执行
Person person = new Person();
实例:
先创建学生类:
import java.io.Serializable;
public class Students implements Cloneable, Serializable {
private int sid; //学号
private String sname; //姓名
private String gender; //性别
private String birthday; //出生日期
private String major; //专业
//一定要保留这个默认的无参数的构造方法,否则spring也无法实例化。
public Students() {
}
public Students(int sid, String sname, String gender, String birthday, String major) {
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
this.major = major;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Students{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", gender='" + gender + '\'' +
", birthday='" + birthday + '\'' +
", major='" + major + '\'' +
'}';
}
}
new关键字
import java.io.*;
import java.lang.reflect.Constructor;
public class IocDemo {
public static void main(String[] args) throws Exception {
Students s1 = new Students(100,"宋小宝","男","1999-10-10","二人转");
System.out.println(s1);
}
}
- 使用反射创建对象
这三种newInstance方法就是大家所说的反射,可以归为一类。事实上Class的newInstance方法内部调用Constructor的newInstance方法。
我们也可以使用Class类的newInstance方法创建对象。这个newInstance方法调用无参的构造函数创建对象。
一)使用Class类的forName方法
Class c = Class.forName("类名"); // 加载、初始化
c.newInstance(); // 实例化
Class class1 = Class.forName("com.huang.class.Person ") ;
class1.newInstance();
或者
Person person2 = (Person) Class.forName("com.huang.class.Person").newInstance();
或者
Person person2 = Person.class.newInstance();
二)使用ClassLoader类的loadClass方法
Class c = ClassLoader.getSystemClassLoader() .loadClass("类名"); // 加载
c.newInstance();// 初始化 ---> 实例化
例如:
Class c = ClassLoader.getSystemClassLoader()
.loadClass("com.huang.class.Person "); // 加载
c.newInstance();// 初始化 ---> 实例化
三)使用Constructor类的newInstance方法创建对象
和Class类的newInstance方法很像, java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。这里需要强调一点private(私有的)修饰的属性或者方法并非绝对的安全,只是对开发者使用的一个约束。属性可以在set()方法中加入约束。
Constructor<Person> constructor = Person.class.getConstructor();
Person person3 = constructor.newInstance();
实例:
import java.io.*;
import java.lang.reflect.Constructor;
public class IocDemo {
public static void main(String[] args) throws Exception {
Students s1 = new Students(100,"宋小宝","男","1999-10-10","二人转");
//反射怎么创建对象呢。大家仔细观察我没有使用new.使用了反射。
Class clazz = s1.getClass();
Constructor constructor = clazz.getConstructor(int.class,String.class,String.class,String.class,String.class);
Students s5 = (Students) constructor.newInstance(new Object[]{100,"小沈阳","女","1999-10-10","二人转"});
System.out.println(s5);
}
}
- 使用clone方法创建对象
Person person4 = (Person) person4.clone();
实例:
import java.io.*;
import java.lang.reflect.Constructor;
public class IocDemo {
public static void main(String[] args) throws Exception {
Students s1 = new Students(100,"宋小宝","男","1999-10-10","二人转");
//使用clone来创建对象。
Students s2 = (Students) s1.clone();
System.out.println(s2);
}
}
反序列化
为了反序列化一个对象,我们需要让我们的类实现Serializable接口
ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Person person5 = (Person) in.readObject();
实例:
import java.io.*;
import java.lang.reflect.Constructor;
public class IocDemo {
public static void main(String[] args) throws Exception {
File file = new File("dest.data");
Students s1 = new Students(100,"宋小宝","男","1999-10-10","二人转");
//反序列化创建对象。
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
out.writeObject(s1); //把宋小宝对象写入到文件中。
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
Students s6 = (Students) in.readObject();
System.out.println(s6);
}
}
2.什么是反射?说说反射是如何应用到spring框架上的?
反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许对其内部成员进行操作。反射机制提供的功能主要有:得到一个对象所属的类;获取一个类的所有成员变量和方法;在运行时创建对象;在运行时调用对象的方法。
spring框架就是用反序列化的思想创建对象,也就是通过文件注入的形式
反序列化其实还是反射的一种表现~
3.maven是什么?maven的核心功能有哪些?
- maven作为Apache组织中的一个颇为成功的开源项目,Maven主要服务于基于Java平台的项目构建、依赖管理和项目信息管理;无论是传统的瀑布式开发还是流行的敏捷模式,Maven都能大显身手。
- maven的核心功能
依赖管理
模块管理
插件管理
部署管理 - 生命周期
maven将工程的构建过程理解为不同的生命周期和阶段, 一个工程的构建过程中,存在着不同的生命周期,生命周期间互相独立,没有一定的顺序关系。 每个生命周期又划分为不同的阶段,不同的阶段之间有明确的顺序关系, 同一生命周期内的阶段必须按顺序依次执行。
clear(清除)
pre-clean:执行清理的准备工作
clean:执行清理工作
post-clean:执行清理后的后续工作
default(核心)
validate:验证项目的正确性及项目所必需的信息是否可用
compile:编译项目中代码
test:用相关的单元测试框架测试编译后的代码,测试代码并不会随项目打包和布署
package:将编译后的代码打包成相应的格式文件,如jar包
integration-test: 如果需要在一个综合环境中运行我们的测试,这个阶段将会运行和布署项目到该环境中
verify: 检查项目中的包是否正确与符合要求
install:将包安装到本地maven仓库,其他项目也可以使用该包作为依赖
deploy:将包发布到远程的maven仓库,并提供给其他开发者使用
site(建立发布项目站点)
pre-site:准备生成
site:生成项目站点和文档
post-site:执行生成文档后的后续工作
site-deploy:发布项目文档
3.什么是MVC?说说分成的好处?
- MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式。
Model(模型):表示应用程序核心,应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据
View(视图):显示数据,应用程序中处理数据显示的部分,通常视图是依据模型数据创建的
Controller(控制器):处理输入,应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据 - 优点
开发人员可以只用管理结构中的某一层
容易使用新的层实替换原有的层
降低层间依赖、也就是解耦,降低程序耦合度
有利于各层逻辑的复用 - 缺点
降低了系统的性能,必须通过中间层才能访问数据库
有时会倒是级联的修改,尤其是在上层做出修改后,下层的结构也要做出对应的修改
5.Spring的俩大核心技术?
- IOC(控制反转)/DI(依赖注入)
一般来说在Java中创建对象是使用new关键字创建的,而使用IOC,只需要在配置文档中进行配置,使用配置文档中的数据进行对象的创建。不用再使用new关键字创建
IOC创建对象的过程是使用类的默认无参构造创建对象,然后使用类的set方法进行属性的赋值
IOC创建对象的本质是反射 - AOP面向切面编程
可以简单的理解为在不改变原有程序的基础上为代码增加新的功能
分为前置增强、后置增强、最终增强、异常增强、环绕增强
需要在原有的类上定义一个切口(方法),然后定义一个用于增强的AOP类,可以在类中定义增强的方法。最后在xml配置文档中进行配置