文章目录
一.给集合添加泛型以外的数据
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class reflectUseDemo1 {
public static void main(String[] args) throws Exception {
//反射的作用一,给指定了泛型的集合加入其他类型的数据
List<String> li = new ArrayList<>();
List<Integer> li1 = new ArrayList<>();
//编译时,两个集合类型不同,但编译后,运行时,都是java.util.ArrayList类型
System.out.println(li.getClass());
System.out.println(li1.getClass());
//所以在运行阶段使用的反射,可以给编译时泛型确定的集合加入异类型
System.out.println(li.getClass() == li1.getClass());
System.out.println("=======divide line========");
li1.add(11);
li1.add(22);
// li1.add("HelloJava");不能这样添加
Class c = li1.getClass();
Method add = c.getDeclaredMethod("add",Object.class);
/**
* 输出集合的add方法的信息如下
* System.out.println('['+add.getName()+"]'return value is ["+add.getReturnType()+
* "], it has paras "+add.getParameterCount());
* [add]'return value is [boolean], it has paras 1
*/
boolean bl = (boolean)add.invoke(li1,"HelloJava");
System.out.println(bl);
System.out.println(li1);
}
}
文章目录
二.用反射创建通用框架
学生类
public class Student {
private String name;
private String gender;
private int age;
private int classNum;
private String hobby;
public Student() {
}
public Student(String name, String gender, int age, int classNum, String hobby) {
this.name = name;
this.gender = gender;
this.age = age;
this.classNum = classNum;
this.hobby = hobby;
}
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;
}
public int getClassNum() {
return classNum;
}
public void setClassNum(int classNum) {
this.classNum = classNum;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
}
老师类
public class Teacher {
private String name;
private String gender;
private int age;
private boolean marry;
public Teacher() {
}
public Teacher(String name, String gender, int age, boolean marry) {
this.name = name;
this.gender = gender;
this.age = age;
this.marry = marry;
}
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;
}
public boolean isMarry() {
return marry;
}
public void setMarry(boolean marry) {
this.marry = marry;
}
}
用于存储不同类对象,比如上面的老师和学生信息的框架
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;
public class MyBatisUtil {
/**
* 用这个框架保存任意对象的信息
*/
public static void saveInfo(Object ob){
try (
PrintStream ps = new PrintStream(new FileOutputStream
("junit_reflect_annotation_proxy\\src\\reflect_usage_data.txt",true))
) {
Class c = ob.getClass();
/**getSimpleName是获取当前类名,getName是获取全限名,包名+类名*/
ps.println("====="+c.getSimpleName()+"=====");
Field[] fi = c.getDeclaredFields();
for (Field field : fi) {
String name = field.getName();
field.setAccessible(true);
String value = field.get(ob) + "";
ps.println(name+"===>"+value+"\r\n");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
最后执行体
public class reflectUseDemo2 {
/**
* 在不清楚对象具体信息的前提下,用反射做通用框架
*/
public static void main(String[] args) {
Student s = new Student();
s.setName("leon");
s.setGender("male");
s.setAge(29);
s.setClassNum(3);
s.setHobby("reading");
MyBatisUtil.saveInfo(s);//那是一个静态方法,类名直接调用,太好了
Teacher t = new Teacher();
t.setName("ashely");
t.setGender("female");
t.setAge(20);
t.setMarry(false);
MyBatisUtil.saveInfo(t);
}
}
本文介绍如何使用Java反射机制实现给泛型集合添加不同类型的元素及创建一个通用框架来存储多种类型的对象,如学生和教师信息。
1760

被折叠的 条评论
为什么被折叠?



