Java-Reflect反射

来源:互联网 发布:pe系统制作软件 编辑:程序博客网 时间:2024/06/05 22:31

反射概述:

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。


GetClass {


    /*
     * Class类就是描述class文件对象的类
     *
     * 获取class文件对象的三种方式
     *     1.Object类中的方法getClass Class<?> getClass() 返回此 Object
     * 的运行时类。
     *     2.通过类名的属性获取 每种数据类型(基本,引用),都会赋予该类型一个calss属性,作用就是获取class文件对象
     *     3.Class类中的静态方法forName static Class<?> forName(String className)
     * 返回与带有给定字符串名的类或接口相关联的 Class 对象。
     *
     * 注意:class文件对象,一个类只会产生一个
     */
    public static void main(String[] args) throws Exception {
        // 1.Object类中的方法getClass Class<?> getClass()
        Bean bean = new Bean();
        Class c1 = bean.getClass();
        System.out.println(c1);

        // 2.通过类名的属性获取
        Class c2 = Bean.class;
        System.out.println(c2);

        // 3.Class类中的静态方法forName(使用的最多的)
        Class c3 = Class.forName("com.simon.Bean");
        System.out.println(c3);
    }

}


GetEmptyConstructor { //快速获取空参构造

    /*
     * 使用反射技术快速获取空参构造方法的对象 使用的前提:
     *     1.获取的类中必须有空参数构造方法
     *     2.空参数构造方法权限不能私有的,建议使用public,使用方便
     *
     * 使用Class类中的方法 T newInstance() 创建此 Class 对象所表示的类的一个新实例。
     */
    public static void main(String[] args) throws Exception {
        Class c1 = Class.forName("com.simon.Bean");
        Object object = c1.newInstance();
        System.out.println(object);
    }

}

GetConstructor { //获取构造函数
    /*
     * 使用反射获取类中的构造方法
     *
     * 使用步骤:
     *     1.获取class文件对象
     *     2.通过class文件对象中提供的方法,获取类中的构造方法
     *     3.把获取到的构造方法初始化执行
     */
    public static void main(String[] args) throws Exception {
        // 1.获取class文件对象
        Class c1 = Class.forName("com.simon.Bean");
        // 2.通过class文件对象中提供的方法,获取类中的构造方法
        Constructor[] constructors = c1.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            // 取消Java的访问权限检查-->暴力反射(不推荐,破坏了类的封装性)
            constructor.setAccessible(true);
        }
        Object object = constructors[1].newInstance("hello world", 100);
        System.out.println(object);
    }
}


GetMembers { //获取成员变量

    /*
     * 使用反射技术获取Bean类中的成员变量
     *
     * 使用步骤:
     *     1.获取class文件对象
     *     2.通过class文件对象中提供的方法,获取类中的成员变量(字段)
     *     3.可以使用字段Field中的方法,设置字段的值,获取字段的值
     */
    public static void main(String[] args) throws Exception {
        // 1.获取class文件对象
        Class c1 = Class.forName("com.simon.Bean");

        // 获取所有成员变量
        Field[] fields = c1.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        // 获取指定成员变量
        Field fieldName = c1.getDeclaredField("name");

        // 设置可访问私有成员变量
        fieldName.setAccessible(true);

        // 获取对象
        Object obj = c1.newInstance();
        // 赋值
        fieldName.set(obj, "lily");
        // 取值
        Object object = fieldName.get(obj);
        System.out.println(object);

    }
}


GetMethods { //获取方法

    /*
     * 使用反射技术获取类中的成员方法
     *
     * 使用步骤:
     *     1.获取class文件对象
     *     2.通过class文件对象中提供的方法,获取类中的成员方法(Method)
     *     3.可以使用字段Method中的方法,运行获取到的方法
     */
    public static void main(String[] args) throws Exception {
        // 1.获取class文件对象
        Class clazz = Class.forName("com.simon.Bean");
        // 2.通过class文件对象中提供的方法,获取类中的成员方法(Method)
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            // System.out.println(method);
        }

        // 获取指定的成员方法
        Method getName = clazz.getDeclaredMethod("getName");
        System.out.println(getName);
        Method setName = clazz.getDeclaredMethod("setName", String.class);
        System.out.println(setName);

        // 获取bean类对象
        Object obj = clazz.newInstance();

        Object setNameObj = setName.invoke(obj, "Lily");
        Object getNameObj = getName.invoke(obj);
        System.out.println(getNameObj);
    }

}

0 0
原创粉丝点击