一、 概述
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
二、反射的使用
1、 获取class的三种方式
//第一种
Man man1=new Man();
Class class1=man1.getClass();
//第二种
Class class2=Man.class;
//第三种
Class class3=Class.forName("xyz.eastgo.demo.Man");//类的路径
2、 通过反射获取成员变量(Field)并使用
Class manClass=Class.forName("xyz.eastgo.demo.Man");
//获取所有公有的字段
Field [] fields=manClass.getFields();
for(Field field:fields){
System.out.println("公有字段"+field.getName());
}
//获取所有 字段
Field [] fields1=manClass.getDeclaredFields();
for(Field field:fields1){
System.out.println("所有字段"+field.getName());
}
//获得字段并使用 私有字段需用getDeclaredField()
Object obj=manClass.newInstance();
Field field=manClass.getDeclaredField("name");
field.setAccessible(true);//解除私有限定
field.set(obj, "root");
Man man=(Man)obj;
System.out.println(man.toString());
3、 反射获取构造方法并使用
//反射获取构造方法并使用
Object obj=manClass.newInstance();
Constructor[] constructor = manClass.getConstructors();
for(Constructor c:constructor){
System.out.println(c);
}
Constructor con = manClass.getConstructor(String.class,String.class,int.class);//里面的参数是构造器的参数.class
con.setAccessible(true);
Man man=(Man)con.newInstance("tom","man",11);
System.out.println(man.toString());
4、 获取成员方法并使用
//获取所有公有成员方法
Object obj=manClass.newInstance();
Method[] method =manClass.getMethods();
for(Method m:method){
System.out.println(m);
}
System.out.println("1111");
//获取所有成员方法
Method[] methods =manClass.getDeclaredMethods();
for(Method m:methods){
System.out.println(m);
}
//获取方法并使用
Object obj=manClass.newInstance();
Method method=manClass.getDeclaredMethod("hidden", null);//方法名,方法的参数
System.out.println(method);
method.setAccessible(true);
method.invoke(obj, null);//要设置参数的值
三、 利用反射复制对象
public static void main(String[] args){
Man man=new Man("tom","man",11);
try {
Man copyMan=(Man)copyBean(man);
System.out.println(copyMan.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
public static Object copyBean(Object obj) throws Exception{
Class<?> classT=obj.getClass();//被copy的类
Object objRes=classT.newInstance();//要返回的copy的对象
//首先获取源对象的Field
Field[] fields=classT.getDeclaredFields();
for(Field field:fields){
System.out.println(field);
//获取get和set方法名
String getMethodName="get"+field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1);
String setMethodName="set"+field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1);
System.out.println(getMethodName+setMethodName);
//获取get方法
Method getMethod=classT.getDeclaredMethod(getMethodName, new Class[]{});
//利用get方法获取源对象的属性值
Object value=getMethod.invoke(obj,new Object[]{} );
System.out.println(value);
//获取set方法
Method setMethod=classT.getDeclaredMethod(setMethodName, new Class[]{field.getType()});
//利用set方法把上面用get方法获取的值set到要复制的对象中
setMethod.invoke(objRes, new Object[]{value});
}
return objRes;
}