反射
反射是在运行状态中,动态获取的信息以及动态调用对象的方法的功能。
优缺点
优点:可以动态执行,在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
缺点:对性能有影响,这类操作总是慢于直接执行java代码。
反射步骤
1).通过一个全限类名创建一个对象
方法一:类名.class属性
Class c1 = Student.class;
方法二:对象名.getClass()方法
Student s = new Student();
Class extends Student> c3 = s.getClass();
方法三:Class.forName(全类名)方法
Class> c4 = Class.forName("com.itheima_02.Student");
2).获取构造器对象,通过构造器new出一个对象
| 方法名 | 说明 |
|---|
| Constructor>[] getConstructors() | 返回所有公共构造方法对象的数组 |
| Constructor>[] getDeclaredConstructors() | 返回所有构造方法对象的数组 |
| Constructor getConstructor(Class>... parameterTypes) | 返回单个公共构造方法对象 |
| Constructor getDeclaredConstructor(Class>... parameterTypes) | 返回单个构造方法对象 |
Class> c = Class.forName("com.itheima_02.Student");
//Constructor>[] cons = c.getConstructors();
Constructor>[] cons = c.getDeclaredConstructors();
for(Constructor con : cons) {
System.out.println(con);
}
Constructor> con = c.getConstructor();
//Constructor> con = c.getDeclaredConstructor();
Object obj = con.newInstance();//T newInstance(Object...initargs)根据指定的构造方法创建对象
System.out.println(obj);
3).通过class对象获得一个属性对象
| 方法名 | 说明 |
|---|
| Field[] getFields() | 返回所有公共成员变量对象的数组 |
| Field[] getDeclaredFields() | 返回所有成员变量对象的数组 |
| Field getField(String name) | 返回单个公共成员变量对象 |
| Field getDeclaredField(String name) | 返回单个成员变量对象 |
Class> c = Class.forName("com.itheima_02.Student");
// Field[] fields = c.getFields();
Field[] fields = c.getDeclaredFields();
for(Field field : fields) {
System.out.println(field);
}
Field addressField = c.getField("address");
//Field addressField = c.getDeclaredField(String name);
Constructor> con = c.getConstructor();
Object obj = con.newInstance();
addressField.set(obj,"西安");//void set(Object obj, Object value) 将指定的对象参数中由此 Field对象表示的字段设置为指定的新值
4).通过class对象获得一个方法对象
| 方法名 | 说明 |
|---|
| Method[] getMethods() | 返回所有公共成员方法对象的数组,包括继承的 |
| Method[] getDeclaredMethods() | 返回所有成员方法对象的数组,不包括继承的 |
| Method getMethod(String name, Class>... parameterTypes) | 返回单个公共成员方法对象 |
| Method getDeclaredMethod(String name, Class>... parameterTypes) | 返回单个成员方法对象 |
//获取Class对象
Class> c = Class.forName("com.itheima_02.Student");
//Student s = new Student();
Constructor> con = c.getConstructor();
Object obj = con.newInstance();
//s.method1();
Method m1 = c.getMethod("method1");
m1.invoke(obj);
//s.method2("张三");
Method m2 = c.getMethod("method2", String.class);
m2.invoke(obj,"张三");
// String ss = s.method3("张三",30);
// System.out.println(ss);
Method m3 = c.getMethod("method3", String.class, int.class);
Object o = m3.invoke(obj, "张三", 30);
System.out.println(o);
//s.function();
// Method m4 = c.getMethod("function"); //NoSuchMethodException: com.itheima_02.Student.function()
Method m4 = c.getDeclaredMethod("function");
m4.setAccessible(true);
m4.invoke(obj);//Object invoke(Object obj,Object... args)调用obj对象的成员方法,参数是args,返回值是Object类型