Java反射机制

Java反射机制允许在运行时检查类的信息并动态调用对象的方法。它涉及Class、Constructor和Method类,可用于访问私有成员、构造器和方法。虽然反射提供强大的功能,如动态对象创建和方法调用,但也会带来性能损失和封装性的破坏。文中通过示例展示了如何使用反射获取类的字段和方法,并创建对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

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

用途

在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。当然,也不是所有的都适合反射,之前就遇到一个案例,通过反射得到的结果与预期不符。阅读源码发现,经过层层调用后在最终返回结果的地方对应用的权限进行了校验,对于没有权限的应用返回值是没有意义的缺省值,否则返回实际值起到保护用户的隐私目的。

一、java反射

1、反射:动态获取类的信息,以及动态调用对象的方法的功能。可以理解为动态看透类的能力。

2、主要功能:

在运行时判断任意一个对象所属的类;

②在运行时构造任意一个类的对象;

③在运行时判断任意一个类所具有的成员变量和方法;

④在运行时调用任意一个对象的方法;

⑤生成动态代理。

通过java反射机制,可以在程序中访问已经装载到JVM中的java对象的描述,实现访问、检测和修改描述java对象本身信息的功能。java反射机制的功能十分强大,java.lang.reflect包中提供了对该功能的支持。

3.Java中反射机制是指在程序运行时,通过提前获取类的信息,动态地操作类和对象的机制。主要有以下三个关键类:Class类、Constructor类、Method类。其中:

1. Class类:表示类类型的类,提供了获取类信息的方法,如获取类名、获取方法等。

2. Constructor类:表示类的构造方法,提供了实例化类的方法,如获取构造方法、创建实例等。

3. Method类:表示类的方法,提供了调用方法的方法,如获取方法、执行方法等。

反射机制的主要作用有:动态地创建对象,动态地获取类信息,动态地调用方法等。但是,由于反射机制在运行时动态地操作对象,所以会带来一定的性能损耗,同时也容易破坏程序的封装性,所以在使用反射机制时需要慎重考虑。
b4a5dda60da5894c180a0b8bc5e1ac75.png (631×359)

 二.使用

  1. 创建BookServiceimpl类和成员变量,构造方法,成员方法

  2. package com.lu.service.impl;
     
    import com.lu.dao.BookDao;
    import com.lu.dao.impl.BookDaoimpl;
    import com.lu.service.BookService;
     
    public class BookServiceimpl implements BookService {
        //类的属性
        public  String name;
        int age;
        protected  String sex;
        private  String address;
     
        public BookServiceimpl() {
     
        }
     
        public BookServiceimpl(String name) {
            this.name = name;
        }
     
        //类的构造方法
        public BookServiceimpl(String name, int age, String sex, String address) {
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.address = address;
        }
     
        BookDao bookDao = new BookDaoimpl();
        @Override
        public void add() {
            bookDao.add();
        }
    }

  3. 测试方法

  4. package com.lu.test;
     
    import com.lu.service.impl.BookServiceimpl;
     
    import java.lang.reflect.Field;
     
    public class test01 {
        public static void main(String[] args) throws Exception {
            //全类名加载class对象
        Class cla = Class.forName("com.xue.service.impl.BookServiceimpl");
        //class对象去做类的手术刀,解刨类里边的东西
            Field[] fields = cla.getFields();
            for (Field field : fields) {
                System.out.println(field);
            }
            System.out.println("-----获取全部内容---------还是单独可以获取到的公共内容------");
            Field[] fields1 = cla.getDeclaredFields();
            for (Field field : fields1) {
                System.out.println(field);
            }
            BookServiceimpl b1 = new BookServiceimpl();
     
            //根据name获取公共的成员方法
            Field name = cla.getDeclaredField("name");
            System.out.println(name);
            //根据age获取成员方法(可以获取到被所有修饰符修饰的成员变量)
            Field age = cla.getDeclaredField("age");
            System.out.println(age);
     
     
        }
    }

  5. 使用.properties配置对应方法

  6.  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值