java中的反射机制

一,反射概念

(1)Java反射机制是指在程序运行时,通过提前获取类的信息,动态地操作类和对象的机制。它可以在运行时动态地生成一个类的对象、访问一个对象的属性和方法、调用一个对象的方法等,从而使得程序具有更高的灵活性和可扩展性。Java反射机制的核心是通过Class对象获取和操作目标类的属性、方法、构造函数等信息,从而达到动态使用目标类的效果。但是,Java反射机制的使用也需要谨慎,因为反射机制存在一定的性能问题,并且可能会破坏程序的封装性,使得程序变得难以维护。

(2)

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

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

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

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

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

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

package com.xue.service.impl;

import com.xue.dao.BookDao;
import com.xue.dao.impl.BookDaoimpl;
import com.xue.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();
    }
}
  1. 测试方法

package com.xue.test;

import com.xue.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对象去做类的手术刀,解刨类里边的东西
        //获取类里边public修饰公共的属性
        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);

    }
}

运行结果:

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

(1)创建info.properties文件

className=com.xue.service.impl.BookServiceimpl

(2)创建测试类

package com.xue.test;

import com.xue.service.BookService;
import com.xue.service.impl.BookServiceimpl;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.util.Properties;

public class Test02 {
    public static void main(String[] args) throws Exception {
        File file = new File("D:\\AXKaiYuanRuanJian\\1\\Spring\\Spring01\\src\\info.properties");
        InputStream stream = new FileInputStream(file);
        Properties p = new Properties();
        p.load(stream);
        String className = p.getProperty("className");
        System.out.println(className);
        //1.通过全类名获取类的class对象
        Class cla = Class.forName("com.xue.service.impl.BookServiceimpl");
        //2.通过class对象获取类的构造器
        Constructor constructor = cla.getConstructor();
//        System.out.println(constructor);
//        Constructor constructor1 = cla.getConstructor();
//        System.out.println(constructor1);
//        Constructor constructor2 = cla.getConstructor(String.class, int.class,String.class,String.class);
//        System.out.println(constructor2);
        //3.使用构造器创建对象
        BookService bookService = (BookService) constructor.newInstance();
        //4.使用对象调用方法
        bookService.add();

        System.out.println("====================================");
        BookService bookService1 = new BookServiceimpl();
        bookService1.add();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值