JAVA反射机制是在运行状态中,
对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意方法和属性;
这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
类名 用途
Class类 代表类的实体,在运行的Java应用程序中表示类和接口
Field类 代表类的成员变量(成员变量也称为类的属性)
Constructor类 代表类的构造方法
Method类 代表类的方法
(1)通过.class
Class class1 = Person.class;
(2)通过创建实例对象来获取类对象
Person person =new Person();
Class class2 = person.getClass();
(3) 通过包名,调用class的forName方法
Class class3 = Class.forName("day07.Person");
通过class对象创建一个实例对象
Cls.newInstance();
通过class对象获得一个属性对象
Field c=cls.getFields():
获得某个类的所有的公共(public)的字段,包括父类中的字段。
Field c=cls.getDeclaredFields():
获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的声明字段
获取构造器对象
Clazz.getConstructor();
通过class对象获得一个方法对象
Cls.getMethod(“方法名”,class……parameaType);(只能获取公共的)
Cls.getDeclareMethod(“方法名”);(获取任意修饰的方法,不能执行私有)
getField
获取一个类的 ==public成员变量,包括基类== 。
getDeclaredField
获取一个类的 ==所有成员变量,不包括基类== 。
getDeclaredMethod*()
获取的是类自身声明的所有方法,包含public、protected和private方法。
getMethod*()
获取的是类的所有共有方法,这就包括自身的所有public方法,和从基类继承的、从接口实现的所有public方法 现的所有public方法。 。
优点:
1)能够运行时动态获取类的实例,提高灵活性;
缺点:
1)使用反射性能较低,需要解析字节码,将内存中的对象进行解析。
2)相对不安全,破坏了封装性(因为通过反射可以获得私有方法和属性)