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