java反射机制
反射
概述
Java反射是一种程序在运行状态中,仅知道类名时,就可以动态的获取类中的信息,创建对象,调用成员对象的机制。
API
-
java.lang.Class:表示类的对象。其中提供了方法来获取类的字段、方法、构造函数等
//获取类的Class对象的方法 //方法1 String className = "";//需要类的全类名(包名+类名) Class cla4 = Class.forName(className); //方法2 Class cla44 = User.class; //方法3 User user = new User(); Class cla444 = user.getClass();
-
java.lang.reflect.Field:表示类的字段(属性)。提供了访问和修改字段的方法
Class cla4 = Class.forName(className); //Class类中相关的方法 cla4.getField("");//获得指定名称的公共成员变量 cla4.getFields();//获得所有公共成员变量 cla4.getDeclaredField("");//获得指定名称的成员变量(包括私有) cla4.getDeclaredFields();//获得成员变量(包括私有)
-
java.lang.reflect.Method:表示类的方法。提供了方法来调用方法
Class cla4 = Class.forName(className); //Class类中相关的方法 cla4.getMethod("");//获得指定名称的公共成员方法 cla4.getMethods();//获得所有公共成员方法 cla4.getDeclaredMethod("");//获得指定名称的成员方法(包括私有) cla4.getDeclaredMethods();//获得成员方法(包括私有)
-
java.lang.reflect.Constructor:表示类的构造函数。提供了方法来获取类中构造方法
Class cla4 = Class.forName(className); //Class类中相关的方法 cla4.getConstructor("");//只能获得指定的公共构造方法 cla4.getConstructors();//获得所有公共的构造方法 cla4.getDeclaredConstructor("");//获得类中指定的方法(包括私有) cla4.getDeclaredConstructors();//获得类中所有的构造方法(包括私有)
流程
//1、通过类名获得Class对象
Class cla4 = Car.getClass();
//2、创建对象
Object object = cla4.newInstance();
//3、访问字段
Field field = cla4.getDeclaredFields();
field.setAccessible(true); // 如果字段是私有的,需要设置为可访问
Object value = field.get(Car); // 获取字段值
field.set(object, "BMW"); // 设置字段值
//4、调用方法
Method method = cla4.getMethod("drive");
method.invoke(object);
//5、获取构造方法
Constructor constructor = cla4.getConstructor(String.class,String.class);
Object object1 = constructor.newInstance("YAMAHA","111");//创建对象
应用场景
Mybatis中的ORM(对象关系映射)、组件...
特点
优
反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力;
反射可以在程序运行时创建一个类的对象,调用成员属性,成员方法,构造方法;
反射是编写框架的基础,他避免了代码写死在框架中,提高了代码的灵活性;
缺
反射中包含一些动态类型,jvm虚拟机不能对其进行优化,因此反射的效率较低;
反射技术最好在没有安全限制的程序环境运行;
反射可以绕过访问限制去访问成员属性和成员方法,这样的操作破坏了java程序的封装性和代码本身的抽象性;