当前位置: java基础教程 > 18-反射与注解 > 阅读正文

反射 与 Class

2021.3.19.   513 次   1411字

反射,是将类的各个组成对象,封装为其他对象,以便在运行中操作这些对象

使用反射机制,可以解耦,并提高程序的扩展性,这也是框架的基础之一

1.获取 class 对象

有 3 种方式获取 class 对象(java.lang.Class<T>),三种获取的是同一个对象

//1.第一种,把程序加载进内存,并返回Class对象,多用于加载配置文件
Class.forName("全限定类名"); //即包名.类名
//2.通过类名的属性获取,多用于参数传递
类名.class
//3.通过对象的方法getClass获取,多用于对象获取字节码
对象.getClass();

任一 java 的 class ,都可以直接 getClass(); 或者 this.getClass() 得到自身的 Class 对象.

2.Class 对象的功能

1.获取成员变量 Field 对象 (java.lang.reflect.Field)
Class myClass = My.Class; //先获取一个 Class
Filed[] fields = myClass.getFields(); //获取所有的public成员变量
for(Field field : fields){
  System.out.println(field);
}
Field a = myClass.getField("a"); //获取一个public成员变量,变量名为a
//如果需要对取变量值,或设置值,只能设置某个对象
My my = new My();
Object value = a.get(my);//取值
a.set(my,"张三"); //设置值
//如果需要获取所有成员变量,getDeclareFields();
//所有变量种获取一个指定的成员变量,getDeclareField("变量名");
//对于私有变量,可以使用 field.setAccessible(true); 暴力反射
2.获取构造器 Constructor 对象(java.lang.reflect.Constructor<T>)
//获取一个构造器对象,如果有参数,需要传递参数类型的class,Constructors不讲
Constructor constructor = myClass.getConstructor(String.class,int.class);
//使用构造器创建对象
Object myObject = constructor.newInstance("张三","23");
//对于私有的属性等,需要用getDeclareConstructor,以及暴力反射等
//对于无参构造,可以直接使用 Class.newInstance();
3.获取方法 Method 对象(java.lang.reflect.Method)
Method met = myClass.getMethod("myMethod"); //获取指定的方法,Methods不讲
//对于私有方法,类似有 getDeclareMethod,暴力反射等也不讲
//需要执行方法,必须 new 对象
met.invoke(my); //使用对象执行方法
//对于重载的方法,可以指定参数
Method met2 = myClass.getMethod("myMethod",String.class);
met2.invoke(my,"Java教程");
4.获取类名
my.getName(); //这个类名,是全限定类名,即包名.类名
my.getSimpleName();//仅类名

本篇完,还有疑问?

加入QQ交流群:11500065636 IT 技术交流群