java中反射是通过一定的条件得到类对象然后进行各种操作的过程;
反射有可以分为几个层次;
1 得到类对象
2. 得到构造方法
3. 得到属性
4. 得到方法
## 反射(重要)
重要的关键字的关键字
Class //获得类对象,大前提
Constructor //获得类中的构造方法,二前提
Method //获得类中的方法
invoke //对获得到的方法传参
Filed //获得类中的变量
set //对获得到的变量进行设置
1. 获得类对象 (关键字Class)
三种方法
1)通过包名获取
Class cls1 = Class.forName("com.reflect.Person"); //括号里面是包名,具体到类,Person是一个类名
2)通过类名获取
Class cls2 = Person.Class;
3) 通过一个构造方法获取
Class cls3 = new Person(1, "小美").getClass(); //Person(1, "小美") 是Person类的一个有参的构造方法
2. 获得构造方法(关键字 Constructor)
先找到类对象:
Class cls = Class.forName("com.reflect.Person");
//获得多个构造方法
1) 获取所有非私有化的构造方法
Constructor[] constructors = cls.getConstructors();
2) 获得所有构造方法(包括私有和非私有)
Constructor allConstructs = cls.getDeclaredConstructors();
//获得指定构造方法,非私有
3) Constructor aConstructor = cls.getConstructor(int.class, String,class); //括号里边是获得构造方法需传入的参数类型
(1)利用获得到的构造方法创造一个新的对象
Person p = (Person) aConstructor.newInstance(1, "妹子");
p.sleep();
p.game();
获得私有化的构造方法
4) Constructor privateConstructor = cls.getDeclaredConstructor(null); //这是一个无参的构造方法
(1) 用得到的构造方法创造对象,需要授权
privateConstructor.setAccessible(true);
Person p2 = (Person) privateConstructor.newInstance(null);
p2.setId(3);
p2.setName("小媚");
3. 获得成员方法(关键字 Method)
首先创建类对象
Class cls = Class.forName("com.reflect.Person");
获得所有方法:
1) 获得所有方法(非私有,同时会获取到父类的方法)
Method[] allMethod = cls.getMethods();
2) 暴力方式获得所有方法(包括私有和非私有,会过滤掉父类的方法)
Method[] allMethods = cls.getDeclareMethods();
获得指定方法:
Person aPerson = (Person) cls.getConstructor(int.class, String.class).newInstance(1, "小花");
3) 获取一个指定的普通公共方法:
Method aMethod = cls.getMethod("test", int.class); // "test" 是指定方法的方法名, int.class 是使用方法需传入参数的类型
aMethod.invoke(aPerson, 6); //对参数进行设置
4) 获取一个静态的方法
Method aStaticMethod = cls.getMethod("ear", null); // null代表此方法不需要传入任何参数
aStaticMethod.invoke(null, null); // 因为没有任何参数,所有不需要设置值
5) 用暴力方法获取一个私有化方法
Method aPrivateMethod = cls.getDeclaredMethod("testPrivate", null); //私有化不需要传入参数所以是null
aPrivateMethod.getAccessible(true); //给方法授权
aPrivateMethod.invoke(aPerson, null); //给私有化设置值
4. 获得成员变量
首先创建类对象
Class cls = Class.forName("com.reflect.Person");
获得所有变量:
1) 获得所有变量(非私有)
Field[] aField = cls.getFields();
2) 暴力方法,获得所有变量(包括私有和非私有)
File[] aFileds = cls.getDeclaredFields();
3) 获得指定变量(非私有)
Field aPublicField = cls.getField("test"); //括号内是指定变量的变量名
aPublicField.set(aPerson, 5); //对获得到的变量赋值
System.out.println(aPerson.test); //变量的使用方法
4) 暴力方法,获得私有化变量
Field aPrivateField = cls.getDeclaredfField("id");
aPrivateField.setAccessible(true); //对变量重新赋值之前需要对变量授权
aPrivateField.set(aPerson, 8); //对变量赋值