目录
问题1:什么是注解(Annotation)?为什么在开发时候用注解? 细聊注解?
问题2:什么是反射? 做什么用的呢?
问题3:什么是泛型? 做什么用的呢?
问题1:什么是注解(Annotation)?为什么在开发时候用注解? 细聊注解?
注解@也叫元数据,常见的@重写Override和@Deprecated,注解它是JDK1.5版本开始引入的一个特性(性质),用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。
《刨根问底栏目组》:
之所以用注解是因为JDK1.5之前的版本中, Spring 中要声明一个 Bean,要通过 XML 配置的方式,现在有了注解,等于减少了一个XML配置文件,减少了开发代码量。 可以直接在类上+注解完成 Bean 的声明工作。
包下面会自动生成一些数据,比如+@controller,importorg.springframework.stereotype.Controller >>意思是使用@controller生成源代码,底层对它会层层调用,从而对使用注解的地方进行一些说明。
package cn.tedu.mapper; import cn.tedu.pojo.User; import org.springframework.stereotype.Controller; import java.util.List; @Controller
问题2:什么是反射? 做什么用的呢?
官方解释:程序在运行状态中,对于任意一个类,都可以知道这个类所有属性和方法,对于任意一个对象都能够调用他的任意方法和属性。比如你用private关键词封装的资源只能类内部访问,外部是不行的,但这个规定被反射赤裸裸的打破了。
note: 字节码是一堆二进制的文件
先说应用方式以具体案例:
首先要想用反射是需要用到API
三种获取字节码的方式
1.Class.forName(“类的全路径”);
2.类名.class
3.对象.getClass();
下面准备一个测试物料类,里面封装属性进行get set 方法,整些构造 整些普通方法
package cn.tedu.review;
public class Student {
//1.定义成员变量
private String name;
public int age;
//2.给被封装属性提供get与set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//3.生成本类的无参构造与全参构造
public Student(){}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//4.提供本类的普通方法
public void play(){
System.out.println("今天大结局,放学后我要写1W行代码玩玩~");
}
public void sunDay(int n){
System.out.println("国庆一共放"+n+"天");
}
//5.为了查看学生对象的具体属性与属性值,重写toString()
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
}
利用反射技术获取类对象,重点看步骤
package cn.tedu.reflection;
import org.junit.Test;
import java.lang.reflect.Method;
import java.util.Arrays;
public class TestReflect {
//1.创建程序的入口函数main()--不用
//2.通过单元测试方法,获取目标类Student对应的字节码对象
@Test
public void getClazz() throws ClassNotFoundException {
//练习获取字节码对象的3种方式
1. Class> clazz1(这里是定义的对象名) = Class.forName("cn.tedu.review.Student");
2.Class> clazz2 = Student.class;
3. Class> clazz3 = new Student().getClass();
//打印的是Student类对应的字节码对象
System.out.println(clazz1);//class cn.tedu.reflection.Student
//获取当前字节码对象clazz1的名字
System.out.println(clazz1.getName());//cn.tedu.reflection.Student
//通过字节码对象,获取Student类的类名
System.out.println(clazz2.getSimpleName());
//通过字节码对象,获取Student类对应的包对象
System.out.println(clazz3.getPackage());
//通过字节码对象,先获取Student类对应的包对象,再获取这个包对象的名字
System.out.println(clazz3.getPackage().getName());
}
常听名词>>>反射技术
《刨根问底栏目组》:
总结就是这个类不是你创建的,是你同事或者直接是第三方公司,此时你要或得这个类的底层功能调用,就需要反射技术实现
问题3:什么是泛型? 做什么用的呢?
泛型的使用符号是 < >通常用来和集合对象一起使用,它是程序的增强器(下面解释为啥增强了?)它也是目前主流的开发方式。如同上面的注解@
泛型<>什么时候用?
知识点1:当操作的引用的数据类型不确定的时候,就用<>,将要操作的引用数据类型传入即可。
其实<>就是一个接收具体引用数据类型的参数范围
知识点2:在程序中,只要用到带有<>的类或者,就要明确传入的具体引用数据类型。
泛型技术是给编译器使用的技术,用于编译时期,确保了类型的安全,运行时,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除。
知识点3:为什么擦除泛型?
因为为了去兼容运行的类加载器
《刨根问底栏目组》:
泛型可以把报错的时机提前,用于在编译期检查集合的数据类型,只要不是规定的类型,就报错,通不过编译,泛型它只在编译时生效,编译通过以后,说明符合语法,泛型就会被抛弃,字节码文件中没有泛型,并且泛型的类型必须使用引用类型,比如Student、Integer。



