Java(7)之反射机制Reflection

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jokeMqc/article/details/91383020

一、反射机制

 指的是可以于运行时加载、探知、使用编译期间完全未知的类。 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;

Class c = Class. forName ("com.mqc.test.User");

 加载完类之后,在堆内存中,就产生了一个 Class 类型的对象(一个类只有一个 Class 对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射.

二、实例

package com.mqc.reflection;

import com.mqc.bean.User;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author maoqichuan
 * @ClassName: Demo01
 * @description: 通过反射操作类(属性,构造器,方法等)
 * @date 2019-06-1015:46
 **/
public class Demo01 {
    public static void main(String[] args) {
        String path = "com.mqc.bean.User";
        try {
            Class<?> clz = Class.forName(path);

            // 通过反射操作构造器构造对象
            /**
             * clz.getConstructor()与getDeclaredConstructors的区别
             * getConstructor只能获取得到修饰符为public的构造器
             * getDeclaredConstructors能够获取得到所有的构造器
             * 属性、方法的API也是类似的道理
             */
            Constructor<?>[] constructors = clz.getDeclaredConstructors();
            //根据具体参数获取构造器
            Constructor<?> constructor = clz.getDeclaredConstructor(String.class, int.class, String.class);
            System.out.println("根据具体参数获取构造器"+constructor);
            for(Constructor temp : constructors){
                System.out.println("类的构造器:"+temp);
            }
            User user = (User) constructor.newInstance("毛其传",24,"001");

            System.out.println("########################");
            // 通过反射操作属性
            Field[] fields = clz.getDeclaredFields();
            Field field = clz.getDeclaredField("userName");
            System.out.println("根据属性名字获取具体属性:"+field);
            for(Field temp : fields){
                System.out.println("类的属性:"+temp);
            }

            // 需要设置跳过安全检查,否则操作private属性时会报错,这也是反射的性能瓶颈所在
            field.setAccessible(true);
            //获取得到field属性后操作属性信息
            System.out.println("通过Field获取得到属性值信息:"+field.get(user).toString());
            field.set(user,"毛其传123");
            System.out.println("修改之后的值:"+field.get(user).toString());

            System.out.println("########################");
            // 通过反射操作方法
            Method[] methods = clz.getDeclaredMethods();
            Method method = clz.getDeclaredMethod("setUserName", String.class);
            System.out.println("根据名字跟参数获取具体方法:"+method);
            for(Method temp : methods){
                System.out.println("类的方法:"+temp);
            }
            // 执行方法
            method.invoke(user,"毛其传3");
            System.out.println("修改之后的值:"+field.get(user).toString());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/jokeMqc/article/details/91383020
今日推荐