A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tianhaolin 初级黑马   /  2018-12-18 16:33  /  904 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 tianhaolin 于 2018-12-18 17:02 编辑

1.反射
将类的组成部分封装为其他对象,就叫做反射机制
反射的好处:-在运行期阶段可以操作Class对象-可以解耦,提高程序的可扩展性Java代码在计算机中的三个阶段
  • 源代码阶段:*.java *.class
  • Class类对象阶段:ClassLoader的加载
  • Runtime运行阶段:运行
2.Class对象详解
获取方式
  • Class.forName(全类名)
多数用于配置文件(Propertis.properties)
  • 类.Class
多数用于参数传递,有些方法如class.getAnnotation(类.class)propertyBeanRowMapper<T>(T.class)
  • 对象.getClass()
多用于获取对象的字节码对象
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,"饭");

类在计算机中的三个阶段.png (92.81 KB, 下载次数: 15)

论坛只让上传小于1M的图片???

论坛只让上传小于1M的图片???

1 个回复

倒序浏览
一个人一座城0.0 来自手机 中级黑马 2018-12-20 12:33:27
沙发
看看不说话
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马