什么是反射?
我看了一些说反射的 大概的意思就是 反射就是把一个对象的所有属性和方法都映射成一个对象。
我就大体找了一下比较常用的方法 获取属性 获取方法
一. 获取 Class 对象
1.Object o=new Object;
Class c1= o.getClass;
2.Class c1=Object.getClass;
3.Class c1=Class.forName("com.xlj.Student");
( package:com/xlj/Student ) forName里面的参数写的全部的包下的全部地址
二.获取 class 的属性
1.获取单个属性
1)只可以获取到 public 修饰的属性
File file=c1.getField("name")
2)获取属性没有权限的限制
File file =c1.getDeclaredField("id");
2.获取多个属性
1)只可以获取到 public 修饰的属性
Field[] files = c1.getFields();
2)获取到全部的属性
Field[] files = c1.getDeclaredFields();
三.获取 class 的方法
1.获取单个方法
1)只可以获取到 public 修饰的方法
Method method=c1.getMethod("show", String.class);
show 是要获取的方法名称 String 是传入的参数
2)获取方法没有权限限制
Method method=c1.getDeclaredMethod("show", String.class);
2.获取多个方法
1)只可以获取到 public 修饰的方法
Method[] methods=c1.getMethods();
2)获取方法没有权限限制
Method[] methods=c1.getDeclaredMethods();
//用一个正则表达式去约束获取 String reg = "^get*"; Pattern r = Pattern.compile(reg); Matcher matcher = r.matcher(method.getName());
四.解除私有限定
1.me
thod.setAccessible(true);
五.获取和设置属性的信息(如果是私有属性赋值时需要解锁私有限定)
1.获取属性名
Field[] files = c1.getDeclaredFields();//获取全部属性
for(Field file :files)//遍历全部属性
{
file.getName(); //获取属性名称
}
2.获取属性的类型
Field file = c1.getDeclaredField("id");//获取属性名为 id 的属性
file.getType();//获取属性的类型
3.获取对象的属性的值
//创建一个方法获来获取传入对象id属性的值
public void getObjectByID(Object object){
Class c=object.getClass();//获去对象
Field field=c.getDeclaredField("id");//获取属性名为id的属性
field.get(object);//获取 id 属性的值
}
4.设置对象的属性的值
//创建一个方法获来设置传入对象id属性的值
public void getObjectByID(Object object){
Class c=object.getClass();//获去对象
Field field=c.getDeclaredField("id");//获取属性名为id的属性
field.setAccessible(true)//如果是私有的属性需要解除私有的权限
field.set(object,"12");//给 id 属性的赋值
}
五.实例Object1 给 Object2属性名相同的属性赋值
方法一:
//o1是赋值方,o2是被赋值方
private void copy(Object o1,Object o2){
//获取对象运行时类,实际对象类
Class c1=o1.getClass();
//获取所有属性,包括私有的.不包括继承父类的?
Field[] fieldArray1=c1.getDeclaredFields();
Class c2=o2.getClass();
Field[] fieldArray2=c2.getDeclaredFields();
//循环寻找对应属性
for (Field field1:fieldArray1
) {
for (Field field2:fieldArray2
) {
//属性类型及属性名判断相等
if (field1.getName().equals(field2.getName())&&field1.getType().equals(field2.getType())){
//解除私有限定
field1.setAccessible(true);
field2.setAccessible(true);
try {
//传入要改变属性值的对象,传入要获取属性值的对象
field2.set(o2, field1.get(o1));
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
}
}
方法二:
public class EntityUtils {
public static Object AtoB(Object a, Object b) {
Class classA = a.getClass();
Class classB = b.getClass();
// 将A的get方法封装为map,key是set方法名字 value是get字段名字
Map<String, Method> amap = new HashMap();
Method[] amethods = classA.getMethods();
try {
for (Method m : amethods) {
String reg = "^get*";
// 创建 Pattern 对象
Pattern r = Pattern.compile(reg);
Matcher matcher = r.matcher(m.getName());
if (matcher.find()) {
TableField annotation = m.getAnnotation(TableField.class);
if (annotation != null) {
continue;
}
String sub = m.getName().substring(3, m.getName().length());
amap.put("set" + sub, m);
}
}
// 获取B的set方法
Method[] bmethods = classB.getMethods();
for (Method m : bmethods) {
if (m.getName().equals("getClass")) {
continue;
}
Method am = amap.get(m.getName());
if (am != null) {
Object o;
o = am.invoke(a);
if (o == null) {
continue;
}
m.invoke(b, o);
}
}
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return b;
}
public static void main(String[] args) {
A a = new A();
B b = new B();
b = (B) EntityUtils.AtoB(a, b);
System.out.println(b.getName() + "," + b.getType());
}
}
原文链接-敬业的小码哥
感谢博主 敬业的小码哥