什么是反射
- 反射机制是在运行状态中
- 对于任意一个类,都能够知道这个类的所有属性和方法;
- 对于任意一个对象,都能够调用它的任意一个方法和属性;
- 这种动态获取的信息以及动态调用的方法的功能称为java语言的反射机制
主要作用
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 生成动态代理
反射API
JAVA提供了反射技术常用的API,位于java.lang.reflect包中
- Class类——可获取类和类的成员信息:java.lang包下
获取Class类对象的三种方法
- Field类——可访问类的属性
- 通过Class对象获取Filed对象
- 调用Filed队形的方法进行取值或赋值操作
方法 | 说明 |
Object get(Object obj) | 返回指定对象上此Field对象字段的值 |
void set(Object obj, Object value) | 将指定对象上此Field对象表示的字段设置为指定的值 |
void setAccessible(boolean flag) | 设置指定对象上此Field对象表示的字段的可见性 |
- Method类——可调用类的方法
- 通过Class对象获取Method对象
- 调用Method对象的invoke()方法
- Constructor类——可调用类的构造方法
- 调用无参构造方法创建对象
调用有参构造方法创建对象
-
//首先建一个People类 //获取类名的三种方法 public static void main(String[] args){ //获取类名方法一 Class<People> class1 = People.class; System.ou.println("类名称:"+class1.getName()); People p1 = new People(); //获取类名 Class class2 = p1.getClass(); System.out.println("类名: "+class2.getName); try { Class class3 = Class.forName("com.zhiyou.reflect.People"); System.out.println("类名:"+class3.getName()); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
package com.zhiyou.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class Demo2 { //通过类名获取类中的构造方法,在使用构造方法创建类对象 public static void main(String[] args) { // TODO Auto-generated method stub try { Class class1 = Class.forName("com.zhiyou.reflect.People"); //获取公共权限(public)的构造方法 Constructor[] constructors = class1.getConstructors(); /*for (Constructor constructor : constructors) { //获取方法名称 System.out.println(constructor); }*/ //获取到类中所有的构造方法 Constructor[] constructors2 = class1.getDeclaredConstructors(); for (Constructor constructor : constructors2) { System.out.println(constructor); } //获取到无参的构造方法 Constructor c1 = class1.getDeclaredConstructor(); //通过构造方法创建对象 People p1 = (People)c1.newInstance(); System.out.println(p1); //获取到带有参数的构造方法 Constructor c2 = class1.getDeclaredConstructor(String.class); //给带有参数的构造方法的参数赋值 People p2 = (People) c2.newInstance("张三"); System.out.println(p2.name); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
public class Demo3 { //通过获取的类名创建Field类对象,并获取类中的属性,然后在用创建的对象对属性进行赋值和取值 public static void main(String[] args) { // TODO Auto-generated method stub //获取属性 try { Class class1 = Class.forName("com.zhiyou.reflect.People"); Field[] fields = class1.getDeclaredFields(); for (Field field : fields) { System.out.println(field); } //根据属性名称获取属性 Field nameField = class1.getDeclaredField("name"); //使用无参数的构造方法 创建对象 People p1 = (People)class1.newInstance(); //p1.name = "李四"; /*nameField.set(p1, "李四"); System.out.println(p1.name);*/ Field heightField = class1.getDeclaredField("height"); //设置权限 heightField.setAccessible(true); //属性赋值 heightField.set(p1, 1.70); //获取属性值 System.out.println(heightField.get(p1)); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package com.zhiyou.reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Demo4 { //通过类名创建Method对象,并获取方法,在通过类名创建调用方法的对象,在通过invoke方法调用对象 public static void main(String[] args) { // TODO Auto-generated method stub try { Class class1 = Class.forName("com.zhiyou.reflect.People"); //获取到本类以及父类中所有的公共方法 Method[] methods = class1.getMethods(); //获取到本类中所有权限的方法 Method[] methods2 = class1.getDeclaredMethods(); for (Method method : methods2) { System.out.println(method); } //param1:方法名 //param2:方法的参数类型 Method method = class1.getDeclaredMethod("sleep", null); Object obj = class1.newInstance(); //p1.sleep(); //设置权限 method.setAccessible(true); //param1:调用方法的对象 //param2:调用方法传入的实参 method.invoke(obj,null); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }