Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性
加载类方法
一个类在 JVM 中只会有一个 Class 实例
//加载类1,常用
Class p = Class.forName(“路径(包名.文件名)”);
//加载类2
Class clazz2 = Person.class;
//加载类3
Class clazz3 = new Person().getClass();
Constructor[] con = p.getConstructors();//只能获取公有构造方法
Constructor[] decon = p.getDeclaredConstructors();//获取含有私有构造函数方法
Class[] in = p.getInterfaces();//获取接口
Class<?> superclass = p.getSuperclass();//获取继承的父类
Field[] fields = p.getFields();//获取非私有类属性
Field[] declaredFields = p.getDeclaredFields();//获取含有私有的所有类属性
Method[] methods = p.getMethods();//获取方法
Method[] deme = p.getDeclaredMethods();//获取含有私有方法的集合
//对变量赋值
Object nein = p.newInstance();//实例化对象
Field del = p.getDeclaredField("name");//获取具体的类属性名
del.setAccessible(true);//获取权限
del.set(nein, "李四");//该对象对该类属性赋值为李四
//获取一个参数的方法
Method meth1 = p.getDeclaredMethod("run",String.class);获取具体的类方法名,后面跟上参数
meth1.setAccessible(true);//权限
meth1.invoke(nein, "李四");//该对象执行该方法,传入的的参数为李四
//调用有参的构造函数
Constructor<?> cons = p.getConstructor(String.class,String.class);
Class<?>[] parameterTypes = cons.getParameterTypes();//获取参数类型
Object n = cons.newInstance("王麻子","18");
//调用有多个参数的方法
Method dec = p.getDeclaredMethod("info", String.class,int.class);
dec.setAccessible(true);
dec.invoke(n, "豆豆",88);
//list集合的反射
List<String> li = new ArrayList<String>();
Class<? extends List> cl = li.getClass();
try {
Method dec = cl.getDeclaredMethod("add", Object.class);
dec.invoke(li, "nihao");
dec.invoke(li, 8888);
dec.invoke(li, new People("lala","16"));
dec.invoke(li, 'a');