例子代码 :
父类 Person 中 有 成员变量 性别,和 梦想 的方法
子类 Boy 中有成员变量 年龄 和 姓名
其中 年龄 属于隐私 被 private 修饰
父类 Person
public class Person {
public int gender;
public void dream() {
System.out.println("我做梦都想开飞机" );
}
}
子类 Boy
public class Boy extends Person {
public String name;
private String age;
public void eat(String food) {
System.out.println(food );
}
private void run() {
System.out.println("换个姿势,再来一遍" );
}
}
不管是获取属性,还是获取方法,首先要搞到 Class 对象
方法一: Class clz = Boy.class
方法二: Class clz = Class.forName(“hao.wen.zhang.testinvok.Boy”);
获取单个属性
区别: clz.getDeclaredField() 可以访问私有成员变量
Field age = clz.getField(“name”);
Field gender = clz.getDeclaredField(“gender”);
获取所有属性
区别:
getFields() 获取 能正常访问到的成员变量 包括 父类的(不包含继承系统的,如:Object)
getDeclaredFields() 获取当前类所有成员变量 不管你爹是谁,不管你修饰符,只管自己
- Field[] fields1 = clz.getFields();
- Field[] fields = clz.getDeclaredFields();
获取单个方法及调用
- 调用 有访问权限的方法 & 有参数
public void invokeMethod() {
Class clz = Boy.class;
try {
Boy boy = (Boy) clz.newInstance();
Method eat = clz.getMethod("eat", String.class);
eat.invoke(boy, "想吃小鸡炖蘑菇");
} catch (Exception e) {
e.printStackTrace();
}
}
输入语句:
05-30 15:50:49.264 22686-22686/hao I/System.out: 想吃小鸡炖蘑菇
- 调用 私有方法 & 无参数
public void invoidPrivateMethod() {
Class clz = Boy.class;
try {
Boy boy = (Boy) clz.newInstance();
//getDeclaredMethod 可以获得私有方法
Method eat = clz.getDeclaredMethod("run");
//被private修饰后 调用此方法才可访问
eat.setAccessible(true);
eat.invoke(boy);
} catch (Exception e) {
e.printStackTrace();
}
}
输出语句:
05-30 15:56:16.695 23861-23861/? I/System.out: 换个姿势,再来一遍
获取所有方法:
clz.getMethods()
- 获取的是 自身有访问权限 及 父类的方法 包括 系统Object类
getDeclaredMethods()
- 获取的是自身的所有方法 (包括私有的)