Java反射机制

Java反射机制是一种强大的编程工具,它允许程序在运行时获取类的信息并操作对象。在本文中,我们将讨论Java反射机制的基础知识、使用方法和代码演示。

反射的定义

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

反射是通过Class对象(字节码文件),来知道某个类的所有属性和方法。也就是说通过反射我们可以获取构造器,对象,属性,方法

反射的优点

反射机制具有以下几个优点:

  • 在运行时动态地获取类的信息,可以大大提高程序的灵活性。
  • 反射机制可以使我们在运行时操作类的对象,可以用于实现一些高级的功能,比如动态代理、注解等。
  • 反射机制可以让我们在编写通用代码时更加灵活和方便。

反射的缺点

反射机制也具有一些缺点:

  • 反射机制的效率比较低,因为它需要在运行时进行类型检查和方法调用。
  • 反射机制容易使代码复杂化,增加维护成本。

反射的使用

获取Class对象

1、new之后使用getClass()获取Class对象

 Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。
Class stuClass = stu1.getClass();//获取Class对象


2、使用静态的class属性获取

Class stuClass2 = Student.class;


3、通过Class类的forName()方法获取常用

Class stuClass3 = Class.forName("com.bean.Student");//括号中是类的全类名(即包名+类名)

 

Class对象中一些方法的使用

先写一个接口和两个接口的实现类

BookService 接口

public interface BookService {
    public void add();
 
    public void fun();
}


BookServiceImpl实现类

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;
    }
 
    private 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() {
        System.out.println("BookServiceImpl...add");
        bookDao.add();
    }
 
    public void fun(){
        System.out.println("BookServiceImpl...fun");
    }
}


BookServiceVip实现类

public class BookServiceVip implements BookService {
    BookDao bookDao=new BookDaoImpl();
    @Override
    public void add() {
        System.out.println("BooKServiceVip...add");
        bookDao.add();
    }
 
    public void fun(){
        System.out.println("BookServiceImpl...fun");
    }
}

在测试类Class中的一些常用的方法

public class Test01 {
    public static void main(String[] args) throws Exception {
        //通过全类名加载类的Class对象
        Class cla = Class.forName("com.service.impl.BookServiceImpl");
        //Class对象可以认为是类的手术刀,可以解刨类里面的东西--属性、构造器、方法
        Field[] fields = cla.getFields(); //只能获取public修饰的属性
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("-------------");
        Field[] fields1 = cla.getDeclaredFields(); //获取所有属性
        for (Field field : fields1) {
            System.out.println(field);
        }
 
        System.out.println("======================");
 
        Constructor[] constructors = cla.getConstructors();//获取构造该方法(public修饰的方法)
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
        System.out.println("-------------");
        Constructor[] constructors1 = cla.getDeclaredConstructors();//获取所有的构造方法
        for (Constructor constructor : constructors1) {
            System.out.println(constructor);
        }
 
        System.out.println("======================");
        Method[] methods = cla.getMethods();//获取所有public修饰的方法
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("-------------");
        Method[] methods1 = cla.getDeclaredMethods();//获得类的所有方法。包括private 声明的和继承类
        for (Method method : methods1) {
            System.out.println(method);
        }
    }
}

你可能感兴趣的:(java,jvm,开发语言)