黑马程序员技术交流社区
标题:
【广州校区】+【原创】+反射的应用
[打印本页]
作者:
jianhong
时间:
2018-8-3 18:33
标题:
【广州校区】+【原创】+反射的应用
本帖最后由 jianhong 于 2018-8-3 18:41 编辑
反射的应用,读取
properties配置文件的属性和值,通过反射创建对象
stu.properties
,存储在项目的
src
文件夹下,内容如下:
class=com.itheima.reflect.Student
name=jack gender=
男
age=18
Student实体类
public class
Student {
private
String
name
;
private
String
gender
;
private int
age
;
public
Student
() {
}
public
Student
(String name
,
String gender
, int
age) {
this
.
name
= name
;
this
.
gender
= gender
;
this
.
age
= age
;
}
public
String
getName
() {
return
name
;
}
public void
setName
(String name) {
this
.
name
= name
;
}
public
String
getGender
() {
return
gender
;
}
public void
setGender
(String gender) {
this
.
gender
= gender
;
}
public int
getAge
() {
return
age
;
}
public void
setAge
(
int
age) {
this
.
age
= age
;
}
@Override
public
String
toString
() {
return
"Student{"
+
"name='"
+
name
+
'
\'
'
+
", gender='"
+
gender
+
'
\'
'
+
", age="
+
age
+
'}'
;
}
}
测试类
根据配置文件信息创建一个学生对象。
import
java.io.FileInputStream
;
import
java.io.InputStreamReader
;
import
java.lang.reflect.Field
;
import
java.util.Properties
;
import
java.util.Set
;
public class
Demo06 {
public static void
main
(String[] args) {
//
获取对象
Student stu = (Student)
createObject
()
;
//
输出对象
System.
out
.println(stu)
;
}
public static
Object
createObject
(){
try
{
//
创建属性集合
Properties p =
new
Properties()
;
//
从文件中加载内容到集合中,编码与
idea
一致避免乱码
p.load(
new
InputStreamReader(
new
FileInputStream(
"stu.properties"
)
,
"utf-8"
))
;
//src
路径下
//
从集合中获得类名
String className = p.getProperty(
"class"
)
;
//
通过反射获得
Class
对象
Class cla = Class.
forName
(className)
;
//
快速创建对象
Object obj = cla.newInstance()
;
Set<String> names = p.stringPropertyNames()
;
//
获取所有属性
//
遍历集合
for
(String name : names) {
//
判断
name
是否
class
if
(name.equals(
"class"
)){
continue;
}
//
获得值
String value = p.getProperty(name)
;
//
根据成员变量名获得对应的
Field
对象
Field f = cla.getDeclaredField(name)
;
//
暴力反射
f.setAccessible(
true
)
;
//
获得成员变量的类型
Class<?> type = f.getType()
;
if
(type==
int
.
class
){
//
判断成员变量的数据类型是否是
int
类型
f.setInt(obj
,
Integer.
parseInt
(value))
;
}
else
{
//
给
f
对象的赋值
f.set(obj
,
value)
;
}
}
//
返回对象
return
obj
;
}
catch
(Exception e) {
e.printStackTrace()
;
}
return null;
}
}
执行main方法后控制台将输出
Student{name='jack', gender='男', age=18}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2