反射是框架设计的灵魂
Java反射是Java语言中一项非常强大的特性,它允许程序在运行时检查和修改自身的行为。在本篇博客中,我们将介绍Java反射的概念、用途和实现方式。
1. 什么是Java反射?
Java反射是指在运行时检查和修改Java程序中对象的能力。通常情况下,我们在编写Java程序时,需要提前知道每个类的方法和属性,然后才能使用它们。但是,有些情况下,我们希望在程序运行时动态地获取类的信息、调用其方法或者修改其属性,这时候就需要使用Java反射。
2. Java反射的用途
1 动态加载类
在Java程序运行时,可以动态地加载类。这对于需要动态加载类的应用程序非常有用,比如应用程序可以根据用户的输入来加载相应的类。
2 获取类信息
Java反射可以用于获取类的信息,包括类名、父类、接口、构造方法、方法、字段等。
3 调用方法
Java反射可以用于调用类的方法,即使这些方法在编译时还没有创建
4 修改属性
Java反射可以用于修改类的属性,即使这些属性在编译时还没有创建
5 生成动态代理
Java反射可以用于生成动态代理,从而可以在运行时生成代理对象,以便在代理对象上执行方法。
3. Java反射的实现方式
Java反射的实现方式主要包括以下几个步骤:
3.1 获取类对象
在使用Java反射时,首先需要获取类对象。可以使用Class.forName()方法获取类对象,也可以使用类的.class属性获取类对象。
//1.通过全类名获取
Class cla = Class.forName("com.man.services.impl.BookServicesImpl");
System.out.println("cla");
3.2 获取构造方法
//2.通过Class获取类的构造器
Constructor constructor = cla.getDeclaredConstructor();
3.3 创建对象
使用Class对象的newInstance()方法可以创建一个类的实例。如果需要调用有参数的构造方法,可以先获取构造方法,然后使用newInstance()方法创建实例。
//3.使用构造器对象
BookServices bookServices = (BookServices) constructor.newInstance();
3.5 调用方法
使用Class对象的getMethod()方法可以获取方法,然后使用Method对象的invoke()方法调用方法。如果需要调用私有方法,可以使用getDeclaredMethod()方法获取私有方法,并设置setAccessible()方法为true,以便访问私有方法。
//4.使用对象调用方法
bookServices.add();
3.6 写入配置文件完整案例
info.properties 配置文件里面以键值对的格式存值
className=com.man.services.impl.BookServicesVipImpl
methodName=add
test01
package com.man.test;
import com.man.services.BookServices;
import java.lang.reflect.Constructor;
public class test01 {
public static void main(String[] args) throws Exception {
//1.通过全类名获取
Class cla = Class.forName("com.man.services.impl.BookServicesImpl");
System.out.println("cla");
//2.通过Class获取类的构造器
Constructor constructor = cla.getDeclaredConstructor();
//3.使用构造器对象
BookServices bookServices = (BookServices) constructor.newInstance();
//4.使用对象调用方法
bookServices.add();
}
}
test02
package com.man.test;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Properties;
public class test02 {
public static void main(String[] args) throws Exception {
//读取配置文件,获取内容
InputStream stream = test02.class.getClassLoader().getResourceAsStream("info.properties");
Properties p = new Properties();
p.load(stream);
String className = p.getProperty("className");
String methodName= p.getProperty("methodName");
//1.通过全类名获取
Class cla = Class.forName(className);
//2.通过Class获取类的构造器
Constructor constructor = cla.getDeclaredConstructor();
//3.使用构造器对象
Object obj = constructor.newInstance();
//4.获取方法名
Method method = cla.getDeclaredMethod(methodName);
//5.执行方法
method.invoke(obj);
}
}
4. 结论
Java反射是一项非常强大的特性,可以让程序在运行时动态地获取类的信息、调用方法或者修改属性。虽然Java反射很灵活,但是由于需要在运行时进行类型检查,所以会影响程序的性能。因此,在使用Java反射时,需要注意性能问题,并且尽可能地避免使用反射来访问属性和调用方法。