本帖最后由 tianhaolin 于 2018-12-18 17:02 编辑
1.反射将类的组成部分封装为其他对象,就叫做反射机制 反射的好处:-在运行期阶段可以操作Class对象-可以解耦,提高程序的可扩展性Java代码在计算机中的三个阶段- 源代码阶段:*.java *.class
- Class类对象阶段:ClassLoader的加载
- Runtime运行阶段:运行
2.Class对象详解获取方式 多数用于配置文件(Propertis.properties)多数用于参数传递,有些方法如class.getAnnotation(类.class)propertyBeanRowMapper<T>(T.class)多用于获取对象的字节码对象Class对象的使用 -Field[] getFields() 获取所有public修饰的成员变量 -Field getField(String name) 获取指定名称的public修饰的成员变量
-Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
-Field getDeclaredField(String name) 获取指定名称的成员变量
-Method[] getMethods()
-Method getMethod(String name,类<?>...parameterTypes)
-Method[] getDeclaredMethods()
-Method getgetDeclaredMethod(String name,类<?>...parameterTypes)
例:
[Java] 纯文本查看 复制代码 [/size][size=3]//1.获取Person的Class对象[/size]
[size=3] Class personClass = Person.class; [/size]
[size=3] //2.获取eat方法[/size]
[size=3]Method eat_method = personClass.getMethod("eat", String.class);
-Constructor<?>[] getConstructors() -Constructor<?> getConstructor(类<?>...parameterTypes)
-Constructor<?>[] getDeclaredConstructors()
-Constructor<?> getDeclaredConstructor(类<?>...parameterTypes)
例:
[Java] 纯文本查看 复制代码 [/size]
[size=3]//1.获取Person的Class对象[/size]
[size=3]Class personClass = Person.class;
//2.获取构造器对象[/size]
[size=3]Constructor constructor = personClass.getConstructor(String.class,int.class);
-String getName();
3.暴力反射 (Field/Method/Constructor)对象.setAccessable(true)
4.Field对象类 Field的方法 -Object get(Object obj):获取object对象指定成员变量的值
-set(Object obj,Object Value):设置object对象,指定成员变量的value
例
[Java] 纯文本查看 复制代码 //获取Person的Class对象
Class personClass = Person.class;
//获取name变量的Field对象(该对象为Private对象)
Field field = personClass.getDeclaredField("name");
//设置暴力反射
field.setAccessible(true);
//获取person对象的name属性
Person person = new Person("张三",20);
Object value = field.get(person);
System.out.println(value); //张三
//设置person对象的name属性为李四
field.set(person, "李四");
System.out.println(person); //Person{name='李四', age=20}
5.Constructure构造器类 -T newInstance(Object...initargets)
例:
[Java] 纯文本查看 复制代码 //获取Person类的Constructor对象(有参)
Constructor<Person> personConstructor = Person.class.getConstructor(String.class,int.class);
//调用newInstance方法创建person对象
Person person = personConstructor.newInstance("王五", 25);
System.out.println(person); //Person{name='王五', age=25}
6.Method方法类 -Object invoke(Object obj,Obj...args);
例:
[Java] 纯文本查看 复制代码 //获取Person的Class对象
Class personClass = Person.class;
//获取eat方法(有参)
Method eat_method = personClass.getMethod("eat", String.class);
//创建对象并执行方法
Person p = new Person();
eat_method(p,"饭");
|