Java反射的使用
反射是Java框架的核心,无论是Tomcat,SpringMVC,SpringIOC,SpringAOP,动态代理,都使用了反射
那么什么是反射?——————-反射就是获取类信息的能力
Java有两种创建对象的方式:①new 对象 ②反射
因此,反射的作用就是,无需new对象,就可以动态获取到一个类的全部信息,包括属性,方法,构造器,以及他们的修饰符,参数,注解等等….从而构造出对象实例并对对象实例进行操作
一、获取类信息
1、获取class对象
- Class.forName(“全类名”) ——- 在 java文件阶段 就可以获取 字节码文件对象,因此这是最常用的(这种是最常用的)
- 类名.class ——— 要在类加载完成阶段才能获取
对象名.getClass() ———— 要在对象已经被创建出来的阶段才能获取
//第一种
Class clazz = Class.forName("fanshe.person");
//第二种
Class clazz1 = person.class;
//第三种
person person = new person();
Class clazz2 = person.getClass();
2、获取变量
Filed[] fileds = clazz.getDeclaredFileds(); //获取全部的变量
Filed[] fileds = clazz.getFileds(); //获取public修饰的变量
Filed filed = clazz.getFiled("变量名"); //获取指定的public修饰的变量
Filed filed = clazz.getDeclaredFiled(变量名"); //获取指定的的变量
3、获取方法
Method[ ] methods = clazz.getDeclaredMethods(); //获取全部的方法
Method[ ] methods = clazz.getMethods(); //获取全部public修饰的方法
Method method = clazz.getMethod("方法名",参数类型.class,参数类型.class...; //单独获取public修饰的方法
Method method = clazz.getDeclaredMethod("方法名",参数类型.class,参数类型.class...); //单独获取方法
4、获取构造器
Constructor[] constructors = clazz.getDeclaredConstructors(); //获取所有的构造器
Constructor[] constructors = clazz.getConstructors(); //获取public修饰的构造器
Constructor constructor = clazz.getConstructor(参数类型.class,参数类型.class..; //单独获取public修饰的构造器
Constructor constructor = clazz.getDeclaredConstructor(参数类型.class ,参数类型.class….;//单独获取构造器
5、获取注解信息
Annotation[] annotations = clazz.getAnnotations();
二、如何操作变量
下面看一段代码示例
Class clazz = Class.forName("fanshe.person");
System.out.println("----------获取 修改值--------------");
//要想获取到值,必须先创建对象,给数据存储空间
person p = new person();
Field age = clazz.getDeclaredField("age");
//get() set()取值和赋值
int ageValue = (int) age.get(p);//类型转换
System.out.println(ageValue);
age.set(p, 20);
int ageValue1 = (int) age.get(p);
System.out.println(ageValue1);
Field height = clazz.getDeclaredField("height");
//私有数据需要使用暴力反射
height.setAccessible(true);//暴力反射
height.set(p, 180);
System.out.println(height.get(p));
//只有private类型需要使用暴力反射
Field name = clazz.getDeclaredField("name");
name.set(p, "张三");
System.out.println(name.get(p));
Field eyes = clazz.getDeclaredField("eyes");
eyes.set(p, 2);
System.out.println(eyes.get(p));
需要注意的是,
如果该属性或方法类型为private,那么需要使用暴力反射,也就是 属性.setAccessible(true)
如果要获取private类型的方法,那么需要使用getDeclared*****
三、调用方法
方法.invoke(对象,”参数”);
clazz = Class.forName("fanshe.person");
Method run = clazz.getDeclaredMethod("run", String.class);
//创建对象,给方法以内存空间
person p1 = new person();
//invoke()执行方法
run.invoke(p1, "张三");
Method change = clazz.getDeclaredMethod("change",String.class,Integer.class);
change.invoke(p1,"小白",183);
Method age = clazz.getDeclaredMethod("getAge", Integer.class);
//暴力反射
age.setAccessible(true);
age.invoke(p1, 18);
还没有评论,来说两句吧...