JAVA反射

来源:互联网 发布:天眼查 知乎 编辑:程序博客网 时间:2024/06/15 19:14
/通过类的名字的字符串表达形式,获取到类这个对象。1
//类的完整名称为:所在包的包名+自己定义的名称
Class cls = Class.forName("extension.Person");

//得到指定的包名
String packageName = cls.getPackage().getName();
System.out.println("得到包名:" + packageName);
//获取其父类
Class superCls = cls.getSuperclass();
String superClsName = superCls.getName();
System.out.println("Person类的父类:" + superClsName);

//获取其实现的构造方法
Constructor[] constructors = cls.getConstructors();
System.out.println("Person类实现的构造方法:" + Arrays.toString(constructors));
//获取其成员方法
Method[] methods = cls.getMethods();
System.out.println("Person中的成员方法:" + Arrays.toString(methods));
//得到方法的返回类型
Class returnType = methods[1].getReturnType();
System.out.println("getName方法的返回类型:" + returnType);
//通过反射的类,实例化该类的对象
Person person = (Person) cls.newInstance();
Field nameField = cls.getDeclaredField("name");
//解除封装,如果没有这句话,则会抛出异常
nameField.setAccessible(true);
nameField.set(person, "小明");
//打印该属性的值
System.out.println("Person类中Name属性的值是:" + nameField.get(person));
//利用反射动态的调用方法
Method getNameMethod = cls.getDeclaredMethod("getName");
getNameMethod.setAccessible(true);
String name = (String) getNameMethod.invoke(person);
System.out.println("调用getName方法得到:" + name);
Method setSexMethod = cls.getDeclaredMethod("setSex", String.class);
setSexMethod.setAccessible(true);
setSexMethod.invoke(person, "男");
0 0