JAVA反射机制

本文介绍了Java反射机制的概念,它允许程序在运行时获取类的信息并动态调用其方法。反射提供了灵活性,但也有效率低和代码复杂性的缺点。通过Class类的方法如forName()可以获取Class对象,进而访问类的属性、方法和构造器。文章还展示了如何通过反射操作接口的实现类,并给出了测试示例。
摘要由CSDN通过智能技术生成

反射的定义,什么是反射

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

反射的优缺点

优点:

在运行时动态地获取类的信息,可以大大提高程序的灵活性;

反射机制可以使我们在运行时操作类的对象,可以用于实现一些高级的功能,比如动态代理、注解等;

反射机制可以让我们在编写通用代码时更加灵活和方便。

缺点:

反射机制的效率比较低,因为它需要在运行时进行类型检查和方法调用;

反射机制容易使代码复杂化,增加维护成本。

反编译:.class-->.java

通过反射机制访问java对象的属性,方法,构造方法等

Class类

Java中java.lang.Class类用于表示一个类的字节码(.class)文件

如何获取Class对象

1)已知类和对象的情况下,类名.class

Class stuClass = Student.class;

2)Object类提供,未知类和对象的情况下,对象.getClass

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

3)Class.forName(“包名.类名”)

Class stuClass2 = Class.forName("com.du.bean.Student");

Class类代表某个类的字节码,并提供了加载字节码的方法:

forName(“包名.类名”),forName方法用于加载类字节码到内存中,并封装成一个Class对象。

一些方法的使用

先写两个接口:

package com.du.dao;

public interface BookDao {

    public void add();

    public void fun();
}
package com.du.service;

public interface BookService {

    public void add();

    public void fun();
}

再写它们的实现类:

package com.du.dao.impl;

import com.du.dao.BookDao;

public class BookDaoImpl implements BookDao {

    public String name;
    int age;
    protected String sex;
    private String address;

    public BookDaoImpl() {
    }

    public BookDaoImpl(String name, int age, String sex, String address) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.address = address;
    }

    public BookDaoImpl(String name) {
        this.name = name;
    }

    BookDao bookDao = new BookDaoImpl();

    @Override
    public void add() {
        System.out.println("BookDaoImpl...add");
    }

    @Override
    public void fun() {
        System.out.println("BookDaoImpl...fun");
    }
}
package com.du.service.impl;

import com.du.dao.BookDao;
import com.du.dao.impl.BookDaoImpl;
import com.du.service.BookService;

public class BookServiceImpl implements BookService {

    BookDao bookDao = new BookDaoImpl();

    @Override
    public void add() {
        System.out.println("BookServiceImpl...add");

        bookDao.add();
    }

    @Override
    public void fun() {
        System.out.println("BookServiceImpl...fun");
    }
}

测试一下:

package com.du.servlet;

import com.du.service.impl.BookServiceImpl;

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

public class Test01 {

    public static void main(String[] args) throws Exception {

        Class cla = Class.forName("com.du.service.impl.BookServiceImpl");

        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);
        }

        System.out.println("***************************************");

        Constructor[] constructors = cla.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }

        System.out.println("---------------------------------------");

        Constructor[] constructors1 = cla.getDeclaredConstructors();

        for (Constructor constructor : constructors1) {
            System.out.println(constructor);
        }

        Method[] methods = cla.getMethods();

        for (Method method : methods) {
            System.out.println(method);
        }

        System.out.println("========================================");

        Method[] methods1 = cla.getDeclaredMethods();

        for (Method method : methods1) {
            System.out.println(method);
        }

    }
}

测试结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值