反射和BeanUtils类

1. 类的初始化:类什么什么情况下会加载到内存中

只要类加载到内存中,那么类加载器就会为这个类创建一个class文件对象

2. javaBean:数据库中的表和java中的类对应关系

javaBean中包含的内容:

1> 私有的成员变量

2> 公共的get/set方法

3> 空参数构造方法(默认)

4> toString方法

5> 实现序列化接口

3. 获取Class文件的三种方式:

1> 使用Object类中的方法

Class> getClass() 返回此 Object 的运行时类。

2> 可以使用类的class属性

任意一种数据类型(基本类型4类8种,引用类型(类,接口,数组))

java都会为这种数据类型赋予一个class属性

3> 可以使用Class类的静态方法获取

static Class> forName(String className) 返回与带有给定字符串名的类或接口相关联的 Class 对象。

方法的参数:

String className:全类名(包名+类名)

4. 使用反射技术获取类中的构造方法,并实例化这个构造方法(创建对象)

实现步骤:

1> 获取Person类的class文件对象

2> 使用class文件对象中的方法getConstructor获取构造方法Constructor

3> 使用Constructor类中的newInstrance方法实例化Person对象

使用前提:

1> 类中必须有空参数构造方法

2> 空参数构造方法的修饰符不能是private,建议使用public

构造方法

public Person()

public Person(String name, int age, String sex)

private Person(String name, int age)

1> Constructor>[] getConstructors() 获取的是所有公共构造方法

Constructor>[] getDeclaredConstructors() 获取类声明(定义)的所有构造方法

Constructor getConstructor(Class>... parameterTypes) 获取指定公共构造方法。

Constructor getDeclaredConstructor(Class>... parameterTypes) 获取指定构造方法。包含私有的

参数:

... 可变参数,可以写,可以不写,可以写多个(0,1,多个)

Class>... parameterTypes:构造方法参数的Class文件对象

2> T newInstance(Object... initargs)

使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

参数:

Object... initargs:调用构造方法,实际传递的参数

返回值:

T:返回的是Object对象,这个Object对象就是Person对象(多态)

3> Method[] getMethods() 获取的类和父类中所有的公共成员方法

Method[] getDeclaredMethods() 公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

4> Method getMethod(String name, Class>... parameterTypes) 获取指定公共成员方法。

Method getDeclaredMethod(String name, Class>... parameterTypes) 获取指定已声明方法。包含私有的

方法的参数:

String name:方法的名称

Class>... parameterTypes:方法参数的class文件对象,String.class,int.class

5> 使用Method类中的方法invoke执行获取到的方法

java.lang.reflect.Method

Object invoke(Object obj, Object... args)

对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。

参数:

Object obj:对象,方法的执行必须有对象支持,要你执行的方法属于哪个对象,就传递哪个对象

传递Person,可以使用反射快速创建对象方式获取

Object... args:调用方法传递的实际使用的参数(值)

返回值:

Object:如果方法有返回值,则返回对应的值,值由各种数据类型,所以使用Object类型接收

如果方法的返回值类型是void,没有返回值,则Object的值是null

6> private void method()

私有方法不能直接使用,需要取消java的访问权限检查

java.lang.reflect.Method extends java.lang.reflect.AccessibleObject

privateMethod.setAccessible(true);//暴力反射

私有构造方法不能创建对象使用,有权限检查,会抛出IllegalAccessException:非法的权限访问异常

可以使用Constructor的父类AccessibleObject中方法设置方法的访问权限

java.lang.reflect.AccessibleObject

void setAccessible(boolean flag) 将此对象的 accessible 标志设置为指示的布尔值。

值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。

值为 false 则指示反射的对象应该实施 Java 语言访问检查。

暴力反射不推荐,破坏了类的封装性

* 反射综合案例:

通过反射技术,获取JavaBean的对象,给JavaBean的成员变量注入(赋)值

* 实现步骤:

1> 创建一个properties配置文件存储成员变量的名字和值

2> 使用Properties集合+IO流,读取配置文件,把健和值保存到Properties集合中

3> 使用反射技术获取javabean的class文件对象

4> 使用反射技术快速创建javabean对象

5> 遍历存储键值对的Properties集合,获取每一对键值

6> 使用获取到的健,拼接setXXX方法

7> 使用反射技术根据拼接的setXXX方法,获取方法的Method对象

8> 使用反射技术调用Method对象中的方法invoke给成员赋值(value)

5. 使用Apache提供的工具类BeanUtils,给成员变量赋值,获取成员变量的值

注意:

BeanUtils可以操作的数据类型有:基本数据类型(4类8种),基本类型的包装类,String类型;以上三种类型的数组形式

BeanUtils赋值的时候,可以把字符串类型的基本类型的值,转换为基本类型给成员变量赋值 相当于 Integer.parseInt("100");

综合案例:

读取XML中的配置文件信息,使用反射技术创建JavaBean对象,使用BeanUtils将XML中的数据保存到JavaBean类的属性中

实现步骤:

1> 定义两个javabean类,Person,Student

2> 定义一个xml文件,存储javabean的全类名和属性名属性值(属性--变量)

3> 使用dom4j解析xml文档,获取javabean的全类名和属性名属性值

4> 使用反射技术,通过获取的全类名,创建javabean对象

5> 使用BeanUtils工具类中的的方法setProperty给成员变赋值

java 反射获取修饰符_java之反射和BeanUtils类相关推荐

  1. java中访问修饰符_Java中的非访问修饰符是什么?

    java中访问修饰符 Java非访问修饰符 (Java non access modifiers) We have 7 non-access modifiers in Java. The name o ...

  2. java中访问修饰符_Java中的访问修饰符介绍

    java中访问修饰符 什么是访问修饰符? (What are Access Modifiers?) Have you ever wanted to define how people would ac ...

  3. java 属性访问修饰符_Java中的访问修饰符(二十七)

    访问(控制)修饰符:可以修饰属性和方法的访问范围 (在实际生活中,如果要获取某件物品,与其直接穿过堡垒的墙壁,从而导致墙壁毁灭和破坏,不如通过门口的警卫请求进入堡垒的许可.一般而言,这对对象同样适用: ...

  4. java中类定义修饰符_Java 中类和方法修饰符

    Java 中类和方法修饰符 类的修饰 访问修饰符 修饰符 class 类名 extends 父类名称 implements 接口名称(notes: 访问修饰符符与修饰符的位置可以互换) 访问修饰符 名 ...

  5. java四种修饰符_java中的四种修饰符

    在编程过程中,经常会遇到四种修饰符来控制访问权限.之前对这个知识点没有研究过,一直是一知半解,每次遇到问题都模棱两可,不能给出一个确切的答案.近几天系统的看了看,也有了自己的一点心得体会. 正文: 先 ...

  6. java中类的修饰符_Java中的类修饰符

    之前每次写小测试程序的时候,总是把一个类放在一个Java文件中,按理说这样比较规范,可主要原因是我是在不知道怎么在一个文件里放多个类,可见java基础有多差了...只要把类的属性改成默认的就可以了,也 ...

  7. java中的权限修饰符_Java的权限修饰符的区别和用法总结

    类中的数据成员和成员函数据具有的访问权限包括:public.private.protect.friendly(包访问权限). 1.public:public表明该数据成员.成员函数是对所有用户开放的, ...

  8. java default修饰符_Java修饰符看这一篇就够了

    java中的修饰符分为类修饰符,字段修饰符,方法修饰符.根据功能的不同,主要分为以下几种: *权限访问修饰符(可以用来修饰类.方法和字段) public:对任何人都是可用的. protect:继承的类 ...

  9. 什么是java修饰符_java修饰符是什么?

    java修饰符用来定义类.方法或者变量,通常放在语句的最前端.(推荐:java视频教程) Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 Java语言定义了public.p ...

最新文章

  1. CDN和Web Cache领域相关的经典书籍推荐
  2. css字体更小 css比12px更小的方法
  3. C/C++笔记(04):GB2312字符串和UTF-8之间的转换
  4. LeetCode 100相同的树101对称二叉树
  5. PMCAFF专访:搜狗effevo,这一次我们想连接“人”
  6. 如何限制某些用户发送Internet邮件
  7. ERROR: ORA-01033: ORACLE initialization or shutdown in progress Oracle无法启动的解决
  8. ML.NET生成器带来了许多错误修复和增强功能以及新功能
  9. 35岁成MIT终身教授!北大数学“黄金一代”再获大奖
  10. 关于SQL Server 2005 的自动远程数据库备份
  11. 剑指offer 面试题49. 丑数
  12. 自学python要多久-自学Python要学会需要多久?老男孩Python培训班
  13. 深入了解一下PYTHON中关于SOCKETSERVER的模块-A
  14. NHibernate ModelBinder for mvc3
  15. php字游戏源码,php文字游戏寻仙纪.zip
  16. 100个Python实战项目(二)使用 Tkinter 的 日历 GUI 应用程序
  17. VScode连接Anaconda
  18. 如何在电脑上录制qq语音
  19. 联想怎么启动windows无线服务器,Windows7系统下开启无线的多种方法
  20. Matplotlib——条形图_3、分组条形图_4、堆叠条形图

热门文章

  1. 解决“Automation 服务器不能创建对象”的问题!
  2. C++的掐拷贝、深拷贝【面向对象程序设计细节】
  3. 【1】刷了1000道二级C语言的题,这些题竟然还是易错题!!(附C语言完整知识点)
  4. nginx反向代理模块配置详解_Nginx服务器的反向代理proxy_pass配置方法讲解
  5. 分区未分配linux,在Linux下对未分配剩余空间分区
  6. 微课--Python正则表达式语法与应用(83分钟)
  7. Python+tkinter实现验证码输入和切换
  8. Python+django建站入门篇:Hello world
  9. C语言数组及相关函数
  10. oracle用户身份认证,oracle用户身份认证方式