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(" ***该方法无参数");
            }
        }

    }

}

 

全部评论

相关推荐

10-09 09:39
门头沟学院 C++
HHHHaos:这也太虚了,工资就一半是真的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务