反射(Reflex)
JAVA反射机制能够使java拥有动态性。 在运行状态中,能够获取能某个类的所有属性和方法;
对于任意一个对象,能够调用它的任意一个方法和属性;这种能够 动态地 获取的信息、调用对象的方法的功能称为java的反射机制。
用到反射,必须认识到:类对象(Class类)每一个字节码文件对应的Class类型的对象
Class类
在java中,类是最小的单位。而Class 类 表示正在运行的 Java 程序中的类或接口。当JVM读取到类时,会发生类加载(类加载知识,见以前笔记),生成Class类的对象。
那么,可以通过构造方法自己创建类对象吗?
当然。。。。不能,Class没有公共构造方法(被私有化了),Class对象只能在类加载时,由虚拟机JVM以及通过 类加载器中的 defineClass方法 自动构造。
反射的使用
// 类对象的获取方式有三种
// 1. 类.class
//获取User的类对象
Class<User> clz = User.class;
// 2. 对象.getClass()
clz.g.getClass()
// 3. Class.forName("类全名") 类全名:包名 + 类名
Class<?> clz3 = Class.forName("java.lang.String") ;
常用API
//获取User的类对象
Class<User> clz = User.class;
//快速 通过 无参构造方法,创建对象
User user = clz.newInstance();
System.out.println(user);
Object o = clz.getDeclaredConstructor().newInstance();
//获取 User 类的 所有 构造方法
Constructor<?>[] constructors = clz.getConstructors();
Constructor<?> constructor = constructors[1];
//参数计数
int parameterCount = constructor.getParameterCount();
System.out.println(parameterCount);
//参数类型
Class<?>[] parameterTypes = constructor.getParameterTypes();
for(Class<?> clzz : parameterTypes){
System.out.println(clzz.getName());
}
可以通过反射运行配置文件内容
public class User{
public void show(){
System.out.println("is show()");
}
}
配置文件
className = Day31_Reflex..User
methodName = show
通过反射越过泛型检查
public class Test03{
public static void main(String[] args) throws Exception{
ArrayList<String> list = new ArrayList<String>();
list.add("HOU");
list.add("hou");
//获取ArrayList的类对象,通过反射获得add()方法,添加数据
Class listClass = list.getClass();
//获取add方法
Method method = listClass.getMethod("add", Object.class);
method .invoke(list