一、什么是反射?
Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。
二、反射的三种方式
这里需要跟大家说一下,所谓反射其实是获取类的字节码文件,也就是.class文件,那么我们就可以通过Class这个对象进行获取。
1、第一种方式
这个方法其实是Object的一个方法,Class继承了Object,所以我们可以直接使用。
2、第二种方式
3、第三种
这里需要注意,通过类的全路径名获取Class对象会抛出一个异常,如果根据类路径找不到这个类那么就会抛出这个异常。
那么这3中方式我们一般选用哪种方式呢?第一种已经创建了对象,那么这个时候就不需要去进行反射了,显得有点多此一举。第二种需要导入类的包,依赖性太强。所以我们一般选中第三种方式。
三、通过反射获取类的构造方法、方法以及属性
public static void main(String[] args){
String className = "com.cn.usermanage.entity.AppraiseBase";
try{
Class baseClass = Class.forName(className);
//获取所有的公用的构造方法
//Constructor[] cons = baseClass.getConstructors();
//获取所有的构造方法
//Constructor[] cons = baseClass.getDeclaredConstructors();
//for(Constructor con : cons){
// System.out.println(con);
//}
//获取公有 & 有参的构造方法
//Constructor cons = baseClass.getConstructor(new Class[]{Long.class,String.class});
//获取私有 & 有参的构造方法
//Constructor cons = baseClass.getDeclaredConstructor(new Class[]{Long.class,String.class});
//System.out.println(cons);
//获取所有公有字段
//Field[] fields = baseClass.getFields();
//获取所有私有字段
// Field[] fields = baseClass.getDeclaredFields();
// for(Field field : fields){
// System.out.println(field);
// }
//获取指定的私有字段
//Field field = baseClass.getDeclaredField("userId");
//获取一个公有的构造方法,实例化
// Object obj = baseClass.getConstructor().newInstance();
// field.setAccessible(true);//设置私有字段的值需要进行暴力破解
// field.set(obj,1L);
// AppraiseBase appraiseBase = (AppraiseBase)obj;
// System.out.println(appraiseBase.getUserId());
//获取所有公有方法
//Method[] methods = baseClass.getMethods();
//获取所有方法
// Method[] methods = baseClass.getDeclaredMethods();
// for(Method method : methods){
// System.out.println(method);
// }
//获取指定方法
// Method method = baseClass.getDeclaredMethod("test2",String.class);
// System.out.println(method);
//获取构造方法,实例化
// Object obj = baseClass.getConstructor().newInstance();
// method.setAccessible(true);
// Object invoke = method.invoke(obj,"123");
// System.out.println(invoke);
}catch (Exception e){
e.printStackTrace();
}
}