Java反射(3)类属性、方法的获取及调用
运行截图:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 通过反射获取类的成员变量
*/
public class Main {
public static void main(String[] args) {
System.out.println("--------------获取类的属性------------");
ClassUtil classUtil = new ClassUtil(1, "Name");
Class cls = classUtil.getClass();
//cls.getFields() 只能获取public的字段
//cls.getDeclaredFields() 可以获取到声明的所有字段
Field[] fields = cls.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
System.out.println("属性类型:" + fields[i].getType().getName() + " 属性名称:" + fields[i].getName());
}
System.out.println("--------------获取类的构造函数------------");
//获取构造函数
try {
Constructor constructor1 = cls.getConstructor();
Constructor constructor2 = cls.getConstructor(int.class, String.class);
System.out.println("构造函数参数个数:" + constructor1.getParameterCount() + " 构造函数名称:" + constructor1.getName());
System.out.println("构造函数参数个数:" + constructor2.getParameterCount() + " 构造函数名称:" + constructor2.getName());
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
System.out.println("--------------调用类的方法------------");
// 通过反射 调用方法
try {
//获取到这个方法
Method method = cls.getMethod("getResult_1");
//调用这个方法 参数为这个类的对象 和 方法的参数 无参数则省略
String str = (String) method.invoke(classUtil);
System.out.println("方法的返回值:" + str);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
import java.lang.reflect.Method;
public class ClassUtil {
private int id;
private String name;
public ClassUtil() {
}
public ClassUtil(int id, String name) {
this.id = id;
this.name = name;
}
public String getResult_1() {
System.out.println("这是一个Public方法");
return "返回值 Return";
}
private void getResult_2() {
System.out.println("这是一个Private方法");
}
/**
* 以上是模拟一个普通的类 下面的方法可以作为一个工具类使用
*/
public static void getClassInfo(Object object) {
//获取传入对象的类类型
Class obj_class = object.getClass();
System.out.println("类名字:" + obj_class.getName());
//getMethods() 获取public方法数组 包括从父类继承的方法
//obj_class.getDeclaredMethods()这个方法是获取声明的方法数组 无论是什么访问权限
Method[] methods = obj_class.getMethods();
//遍历方法数组
for (int i = 0; i < methods.length; i++) {
//getReturnType() 返回的是 返回值类的class 所以还应该加上getName()
System.out.print("方法名:" + methods[i].getName() + " 返回值类型:" + methods[i].getReturnType().getName());
//获取某个方法的所有参数
Class[] cls = methods[i].getParameterTypes();
if (cls.length != 0) {
for (int j = 0; j < cls.length; j++) {
System.out.println(" 方法的参数:" + cls[j].getName());
}
} else {
System.out.println(" ***该方法无参数");
}
}
}
}