反射笔记
反射
reflection library
reflective:能分析类的能力的程序
参考:https://www.zhihu.com/question/377483107/answer/1079967402
https://www.w3cschool.cn/java/java-reflex.html
学习方法:学习一项新的技术之前,请先搞清楚为什么要学这个新的东西?
重点掌握
获取Class的几种方式 通过Class创建对象,获取构造器、成员变量、方法 通过反射API修改成员变量的值,调用方法
Class类的主要API
成员变量--Field 方法--Method 构造器--Constructor
一)获得Class类的方式(手工地加载某个类)
1.Object类的getClass()方法
Random r = new Random();
Class<?> rClass = r.getClass();
System.out.println(rClass);//class java.util.Random
System.out.println(rClass.getName());//java.util.Random
2.Class类中的静态方法 public static Class ForName(String className)
Class clazz = Class.forName("com.pengluo.User");//参数:完整路径的包名和类名
父类对象clazz.getSuperclass()
实现的接口clazz.getInterfaces()
3.任意类型.class
Class c1 = int.class;
Class c2 = Double[].class;
Class c3 = ArrayList.class;
二)实例一个Class类的对象
//方法一:默认构造方法
User u1 = (User) clazz.newInstance();
//set方法赋值
u1.setName("pengluo");
u1.setSex("male");
//方法二:获取全部的构造函数,选择一个构造函数创建对象
Constructor<?> cons[] = clazz.getConstructors();
user = (user) cons[0].newInstance("Rollen");
三)获取Class类的成员变量(属性)
1: 获取Class对象
2:通过Class对象获取Constructor对象
3:Object obj = Constructor.newInstance()创建对象
4:Field field = Class.getField("指定变量名")获取单个成员变量对象
5:field.get(obj) 获取obj对象的field字段的值
6:field.set(obj,"") 为obj对象的field字段赋值
Field[] Fieds = clazz.getFields();//获得类以及从超类(父类)中继承到的公共域
Field[] Fieds = clazz.getDeclaredFields();//获得类中声明的全部域,包括私有的
//遍历输出
for (int i = 0; i <Fieds.length ; i++) {
String name = Fieds[i].getName();
String Type = Fieds[i].getType().getName();
System.out.println(name+":"+Type);
}
Field name = clazz.getDeclaredField("name");//获取Class类的特定的成员变量(属性)
四)获取Class类的方法
Method method[] = clazz.getMethods();//获得类以及从超类(父类)中继承到的公有方法
Method method[] = clazz.getDeclaredMethods();//获得类中声明的全部方法,包括私有的
Method method = clazz.getMethod();//获取Class类的某个指定的方法
//如果调用的是私有方法那么需要暴力访问
method.setAccessiable(true);
ArrayList<Integer> list = new ArrayList<Integer>();
Method method10 = list.getClass().getMethod("add",Object.class);
method10.invoke(list,"Java反射机制实例。");