- 概念:
反射是一种机制,利用该机制可以在程序运行过程中对该类进行解剖并操作类中的所有成员(成员变量, 成员方法, 构造函数)
反射操作类成员的前提:获取该类字节码文件对象Class对象
三种获取方式
方式1: 通过类名.class获得
方式2: 通过对象名.getClass()获得
方式3: 通过Class类的静态方法获得: Class.forName(“类全名”);
每一个类的Class对像只有一个;
| 方法 | 说明 |
|---|---|
| class常用方法 | |
| String getSimpleName() | 获取类名 |
| String getName() | 获取类全名 |
| T newInstance() | 创建Class对象关联类的对象 |
| Constructor | |
| Constructor getConstructor(Class… parameterTypes) | 根据参数类型获得对应的public修饰的Constructor对象。 |
| Constructor[] getConstructors() | 获取所有public修饰的构造方法对象 ,返回数组 |
| Constructor getDeclaredConstructor(Class… parameterTypes) | 根据参数类型获取任意修饰符对应的Constructor对象 |
| Constructor[] getDeclaredConstructors() | 获得类中的所有构造方法对象,任意修饰符修饰的 ,返回数组 |
| Constructor常用方法 | |
| T newInstance(Object … initargs) | 根据指定的参数创建对象 |
| void setAccessible(boolean bo) | 设置是否取消权限检查,true为暴力反射,false表示不取消 |
| Method | |
| Method getMethod(String name,Class…args) | 获取用public修饰的对应的方法名和参数类型的构造方法对象 |
| Method[] getMethod() | 获取用所有public修饰的对应的方法名和参数类型的构造方法对象, 返回一个数组 |
| Method getDeclaredMethod(String name,Class…args) | 获取任意修饰符修饰的对应的方法名和参数类型的构造方法对象 |
| Method[] getDeclaredMethod() | 获取任意修饰符修饰的对应的方法名和参数类型的构造方法对象,返回一个数组 |
| Method常用方法 | |
| Object invoke(Object obj, Object… args) | obj:调用指定对象obj的该方法, arge:调用方法时传递的参数 |
| void setAccessible(boolean be) | 暴力破解 |
| Field | |
| Field getField(String name) | 根据成员变量名获取public修饰的Field对象 |
| Field[] getFields() | 根据成员变量名获取public修饰的Field对象,返回一个数组 |
| Field getDeclaredField(String name) | 根据成员变量名获取任意修饰符修饰的Field对象 |
| Field[] getDeclaredField() | 根据成员变量名获取任意修饰符修饰的Field对象, 返回一个数组 |
| Field常用方法 | |
| setXxx方法都是给对象obj的属性设置使用,针对不同的类型选取不同的方法。 | |
| void set(Object obj, Object value) | |
| void setInt(Object obj, int i) | |
| void setLong(Object obj, long l) | |
| void setBoolean(Object obj, boolean z) | |
| void setDouble(Object obj, double d) | |
| getXxx方法是获取对象obj对应的属性值的,针对不同的类型选取不同的方法。 | |
| Object get(Object obj) | |
| int getInt(Object obj) | |
| long getLong(Object obj) | |
| boolean getBoolean(Object ob) | |
| double getDouble(Object obj) | |
| void setAccessible(boolean bo) | 暴力破解 |
| Class getType() | 获取属性的类型,返回Class对象 |
泛型
JDK1.5之后新增的语法,使用于未知类型的定义,可以作用在类,方法,接口中。
好处:
- 将运行时期的ClassCastException,转移到了编译时期变成了编译失败
- 避免了类型强转的麻烦
定义格式:
修饰符 class 类名<代表泛型的变量>{}
class ArrayList{ public boolean add(E e){} public E get(int index){} }
泛型只需要在创建对象的时候确定类型,如:
class NewArrayList{
public void demoList(){
ArrayList arr = new ArrayList<>();
}
}
//这回ArrayList会如下
class ArrayList{
public boolean add(String e){}
public String get(int index){}
}
泛型方法定义格式:
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
public class GenMethod{
public void show (T t){
System.out.println(t.getClass());
}
public T show2 (T t){
return t;
}
}
泛型接口:
修饰符 interface 接口名<泛型变量名> {
}
public interface GenInterface{ public abstract void add(E e); public abstract E getE(); }
接口定义的泛型可以在实现类或者实现类对象中确定
泛型通配符:>
不知使用什么类型接受的情况下可以使用泛型通配符?来表示未知通配。
void main(String[]args){
Collection list1 = new ArrayList();
getElement(list1);
Collection list2 = new ArrayList();
getElement(list2);
}
void getElement(Collection> coll){}
//?表示任意类型
泛型上限:
格式:类型名称 extends 类> 对象名称
只能接收该类型及其子类
泛型下限:
格式:类型名称 super 类> 对象名称
只能接收该类型及其父类型
public static void main(String[] args) {
Collection list1 = new ArrayList();
Collection list2 = new ArrayList();
Collection 


