一、Java 泛型
1、 泛型的标记符号:
E - Element 元素
T - Type 类型
K - Key 键
V - Value 值
N - Number 数值类型
? - 不确定类型(通配符)
注意基本数据类型要作为泛化参数时需要用包装类型
int - Integer
char - Character
double - Double
float - Float
boolean - Boolean
short - Short
long - Long
byte - Byte
2、 ?通配符
<? extends T> 表示类型上界,表示可以接收该类型 T 或者 T 的子类
<? super T> 表示类型下界,表示参数化类型是 T 类或者是 T 的父类
<? extends T> 不确定类型,虚拟机无法分配空间 , 一般是只能读取,不能设置内容( null 除外)
// 接收的就是 Man 以及它的子类(不能设置只能读取)
MyArrayList<? extends Man> list2 = new MyArrayList<Man>();
// 该类型或者其父类
MyArrayList<? super Man> list3 = new MyArrayList<Man>();
泛型方法
泛型方法在定义时,需要在返回值之前加上一个 <T>, 如
public static <T> void test(T t){
}
public <T> T test(T t){
}
二、 Java 反射
Java 反射是可以让我们在运行时来操作类的方法、属性、父类、接口等 , 所有的 Java 文件都会被编译为 .class 文件, class 文件最终会被 ClassLoader 加
载到虚拟机中去执行,加载过程中每个 class 文件会自动生成对应的 Class 对象
1、Class 对象的获取
// 基于类名 .class 获取 Class 实例
Class<?> cls = Person.class;
// 使用对象的 getClass 方法获取
Person p1 = new Person();
Class<?> cls2 = p1.getClass();
try {
Class<?> cls3 = Class.forName("com.types.Person");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
2、方法调用
// 获取所有构造方法
Constructor<?>[] constr = cls.getConstructors();
// 获取一个精确的构造
Constructor<?> constructor = cls.getConstructor(String.class,int.class);
在反射的使用时如果要操作方法建议去掉 Java 语言环境的检测,通过以下方式去掉即可 ( 对所有方法有效 )
constructor.setAccessible(true);
使用构造方法创建对象
Person p = (Person) constructor.newInstance(" 张三 ",18);
使用无参构造创建
Person p2 = (Person) cls.newInstance();
获取方法(普通方法)
获取本类中所有定义的方法包括 private 、 public 、 protected 、 default
Method[] ms = cls.getDeclaredMethods();
// 获取所有公开方法(包括父类中的公开方法直到 Object )
Method[] ms = cls.getMethods();
// 获取精确的方法
Method m = cls.getDeclaredMethod("wearClothes", String.class);
m.setAccessible(true);
// 执行方法
boolean r = (Boolean)m.invoke(p, " 运动服 ");
3、 属性操作
// 获取某一个精确的属性
Field f = cls.getDeclaredField("name");
// 设置属性值
f.setAccessible(true);
f.set(p, " 李四 ");
// 获取某一个精确的属性
Field fa = cls.getDeclaredField("a");
// 设置属性值
fa.setAccessible(true);
fa.set(p, 100);
获取父类
// 获取父类 (Object 的父类是 null)
Class<?> superCls = cls.getSuperclass();