java反射(Java Reflection)

什么是反射

        反射是一种机制,利用反射机制动态的实例化对象、读写属性、调用方法、构造函数。

也就是说,反射本质上是一个“反着来”的过程。我们通过new创建一个类的实例时,实际上是由Java虚拟机根据这个类的Class对象在运行时构建出来的,而反射是通过一个类的Class对象来获取它的定义信息,从而我们可以访问到它的属性、方法,知道这个类的父类、实现了哪些接口等信息。

反射能干什么用

  • 获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等

  • 获取任意对象的属性,并且能改变对象的属性

  • 调用任意对象的方法

  • 判断任意一个对象所属的类

  • 实例化任意一个类的对象

  • 通过反射我们可以实现动态装配,降低代码的耦合度,动态代理等。

 如何使用反射?

                        一切与反射相关的代码都从获取类对应的字节码对象开始。

  • 调用某个类的对象的getClass()方法,即:对象.getClass();

Student stu=new Student();
Class clazz=stu.getClass();

  • 调用类的class属性类获取该类对应的Class对象,即:类名.class

Class clazz=Student.class; 

  • 使用Class类中的forName()静态方法,即:Class.forName(“类的全路径”)  

Class clazz=Class.forName("com.zking.entity.Student"); 

传统实例化与反射实例化的区别

  传统实例化

Student stu=new Student();       

  反射实例化 

Class clazz=Class.forName("com.zking.entity.Student");
Object newInstance = cla.newInstance();

 注:1)Class.forName指定全路径名必须正确,否则将报ClassNotFoundException错误;

         2)在运行期间,一个类,类对象只能创建一个

 反射的应用

类名用途
Class类代表类的实体,在运行的Java应用程序中表示类和接口
Field类代表类的成员变量(成员变量也成为类的属性)
Method类代表类的方法
Constructor类代表类的构造函数

获取与Field类相关

        

类名 用途
getField(String name)获取某个公共的属性对象
getFields()获取所有公共的属性对象
getDeclaredField(String name)获取某个属性对象(public和非public)
getDeclaredFields()获取所有属性对象(public和非public)
setAccessible(boolean flag)默认值false,设置true使私有成员允许访问
set(Object,Object)属性赋值
get(Object)获取属性

代码应用

//反射实例化
        Class<?> studentClass = Class.forName("com.zking.j2ee07.entity.Student");
        Object stu = studentClass.newInstance();
//4.读写属性(field)
    //1)获取单个的公共属性
        Field field = studentClass.getField("age");
    //2)获取公共的,私有的,受保护的,最终的,静态的等等的单个属性
        Field field = studentClass.getDeclaredField("age");
    //3)获取所有的公共属性
        Field[] fields = studentClass.getFields();
    //4)获取所有公共的,私有的,受保护的,最终的,静态的等等的属性
        Field[] fields = studentClass.getDeclaredFields();
           for (Field field : fields) {
            System.out.println("属性名称"+field.getName());
            System.out.println("属性类型"+field.getType());
            System.out.println("访问修饰符"+field.getModifiers());
            System.out.println("----------------------");
        }
        //5)属性赋值
        Field field = studentClass.getField("age");
        Field field = studentClass.getDeclaredField("sname");
        //设置权限
        field.setAccessible(true);
        //set方法:1)实例化对象名 2)赋的值
        field.set(stu,"zking");
        //6)获取属性
        //get方法参数:实例化对象名
        Object age = field.get(stu);
        System.out.println(age);

 注:博主这里的代码注释都打开了,在运用时记得写一个板块注释一个

 获取与Method相关

类名用途
getMethod(String name, Class<>… parameterTypes)获取该类某个公共的方法
getMethods()获取该类所有公共的方法
getDeclaredMethods(String name,Class<>… parameterTypes)获取该类某个方法(public和非public)
getDeclaredMethod()获取该类所有方法(public和非public)
setAccessible(boolean flag)默认值false,设置true使私有方法允许访问
invoke(Object obj, Object… args)执行方法

代码应用

//获取类对象
Class clazz = Class.forName("com.zking.ssm.model.Student");
//反射机制实例化对象
Student student = (Student) clazz.newInstance();
//获取有参方法
Method method=cla.getDeClaredMethod("hello", String.class);
//设置访问权限
method.setAccessible(true);
//执行方法(无返回值)
//method.invoke(student,"张三");
//执行方法(有返回值)
Object obj=method.invoke(student, "张三");

获取Constructor类相关

类名用途
getConstructor(Class<>… parameterTypes)获取该类中与参数类型匹配的公有构造方法
getConstructors()获取该类的所有公共构造方法
getDeclaredConstructors(Class<>… parameterTypes)获取该类中与参数类型匹配的构造方法
getDeclaredConstructors()获取该类所有构造方法(public和非public)

 代码应用

//反射实例化
        Class<?> studentClass = Class.forName("com.zking.j2ee07.entity.Student");
        Object stu = studentClass.newInstance();
//6.构造方法(Constructor)
        //1)获取该类中与参数类型匹配的公有构造方法
        Constructor<?> constructor = studentClass.getConstructor(String.class);
        //2)获取该类中与参数类型匹配的构造方法
        Constructor<?> constructor = studentClass.getDeclaredConstructor(String.class);
        //3)获取该类的所有公共构造方法
        Constructor<?>[] constructor = studentClass.getConstructors();
        //4)获取该类所有构造方法(public和非public)
        Constructor<?>[] declaredConstructors = studentClass.getDeclaredConstructors();
        for (Constructor<?> constructor1 : declaredConstructors) {
            System.out.println(constructor1.getName());
            System.out.println(constructor1.getModifiers());
            System.out.println(constructor1.getParameterCount());
        }
        //5)调用方法
        Constructor<?> constructor = studentClass.getConstructor(String.class);
        Constructor<?> declaredConstructor = studentClass.getDeclaredConstructor(String.class);
        System.out.println(declaredConstructor);
        Object instance = declaredConstructor.newInstance("zking");
        System.out.println(instance);

 今天的分享就到此结束啦!关注博主,持续更新!

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​      

                                                      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值