本文主要从以下几点来学会如何使用反射
- 如何获取一个类
- 如何获取属性(成员变量)
- 如何获取构造方法
- 如何获取普通方法
- 如何使用反射执行方法
- 如何执行get/set方法
实列
1:获取类的几种方法
// 如何获取类
@Test
public void test() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> cls = Class.forName("com.rep.pojo.Person");//1根据字符串获取类型
Person p1 = new Person();//创建对象(静态)
Class cls2 = p1.getClass();//2根据对象获取其类型
Class cls = Person.class;//3
}
总结:
1:Class.forName(“从包路径到类的名称”);
2:类名称.Class;
3:对象.getClass;
2:获取属性的方法(成员变量)
public void test1(){
Class cls = Person.class;
// 获取当前类的成员变量的集合
Field[] fields = cls.getDeclaredFields();
System.out.println("public class "+ cls.getName()+"{");
for (Field field : fields) {
String fname = field.getName();//取成员的名称
Class<?> fType = field.getType();//取成员的类型
String ftypeName = fType.getName();//获取成员类型的名称
String nftname = ftypeName.substring(ftypeName.lastIndexOf(".")+1);//取类型的短名称
int fm = field.getModifiers();//获取成员的修饰符的值
String fmName = Modifier.toString(fm);//获取成员修饰符的字面值(名)
System.out.println(fmName +" "+nftname+" "+fname +";");
}
System.out.println("}");
}
3:获取构造方法
public void test2(){
Class cls = Person.class;
System.out.println("public class "+ cls.getName()+"{");
Constructor[] constructors = cls.getDeclaredConstructors();//获取所有的构造方法
for (Constructor c : constructors) {
String cname = c.getName();//获取构造方法的名称
String cmName = Modifier.toString(c.getModifiers());//获取构造方法的限定词(访问修饰符)
System.out.print(cmName+" " +cname+"(");
Class[] ccls = c.getParameterTypes();//获取构造方法的参数类型的数组
for (int i = 0; i < ccls.length; i++) {
String parameterTypeName = ccls[i].getName();//获取参数类型的名称
System.out.print(parameterTypeName+" arg"+i+" ,");
}
System.out.println(")");
}
System.out.println("}");
}
4:获取普通方法
public void test3(){
Class cls = Person.class;
System.out.println("public class "+ cls.getName()+"{");
Method[] methods = cls.getDeclaredMethods();//获取类的所有方法
for (Method m : methods) {
String methodName = m.getName();//获取方法名
Class<?> returnCls = m.getReturnType();//获取方法的返回值类型
String rtName = returnCls.getSimpleName();//获取返回值类型的短名称
String mname = Modifier.toString(m.getModifiers());//获取方法的访问修饰符
System.out.print(mname+" "+rtName+" "+methodName+"(");
Class<?>[] paramTypes = m.getParameterTypes();//获取该方法的参数类型的数组
for (int i = 0; i < paramTypes.length; i++) {
String ptName = paramTypes[i].getSimpleName();//获取方法参数类型的短名称
System.out.print(ptName+" arg"+i+",");
}
System.out.println(")");
}
System.out.println("}");
}
5:使用反射执行方法
public void test4() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException{
Class cls = Person.class;//获取类型
Method method = cls.getDeclaredMethod("sayHello", String.class);//根据方法名+参数列表获取方法名;
Object obj = cls.newInstance();//通过类型动态(运行时)创建对象
String name = "zhang san ";//构造方法执行的参数对象
Object returnVal = method.invoke(obj, name);//使用obj对象执行其method方法,并送入实参name,放回Object类型的结果值
System.out.println(returnVal);
}
6:执行get/set方法
public void Test5() throws IntrospectionException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Class cls = Person.class;//获取类型
String key = "pname";
PropertyDescriptor pd = new PropertyDescriptor(key, cls);//构造一个属性描述对象
Method setMethod = pd.getWriteMethod();//获取某属性的写方法 ;getReadMethod()回去读方法
Object obj = cls.newInstance();
setMethod.invoke(obj, "lisi");
System.out.println(obj);
}