什么是反射?
反射是在java程序运行过程中,对于任意的类,都能获取类的属性和方法,可以调用他的任意方法和构造函数,对属性进行赋值,这种机制我们称之为反射。
反射理解
理解反射之前,我们需要了解类的基本信息
一个类有:名称,包路径,修饰符,成员属性,构造函数以及普通函数等。
java反射是基于类的class 来获取类的信息。所以了解反射前了解以类class几中获取方式。
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
/**
* class 的四种获取方式
*/
Class clazz1 = User.class;
Class clazz2 = Class.forName("com.cui.reflect.User");
Class clazz3 = new User().getClass();
Class clazz4 = ReflectDemo.class.getClassLoader().loadClass("com.cui.reflect.User");
}
}
我们说反射可以动态获取类对象信息并且对类中属性动态赋值,反射到底怎么做到的,通过下面一个简单的例子感受一下
//常规创建一个对象并且赋值
User user1 = new User();
user1.setName("zhangsan");
//使用反射
Class clazz = User.class;
//反射创建对象
User user2 = (User) clazz.newInstance();
//获取指定字段
Field name = clazz.getDeclaredField("name");
//因为字段是私有的 需要设置强制访问
name.setAccessible(true);
//设置字段值
name.set(user2, "zhangsan");
System.out.println(user2.getName());
反射常用API以及理解
-
获取类名和包路径
//获取类的名称 ->User String simpName = clazz.getSimpleName(); //类的全名称 com.cui.reflect.User String fullName = clazz.getName();
-
获取类的修饰符
//类修饰符 返回int 类型 1:public 2:private 4:protected 8: static // 16:final 32: syncharonized 64:volatie 128: transient 256: native clazz.getModifiers();
-
获取类的构造函数
//无参构造器 Constructor<User> constructor = clazz.getConstructor(); User o1 = constructor.newInstance();//构建对象 //有参构造器 Constructor<User> constructor1 = clazz.getConstructor(String.class, int.class); User o2 = constructor1.newInstance("zhangsan", 2);//构建对象
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。