反射是指在程序运行期间,能够观察和修改类或者类的对象的属性和行为的特性
1.反射概述:
java中反射的定义: Java Reflection
·反射是指对于任何一个Class类,在"运行的时候"都可以直接得到这个类全部成分。
·在运行时,可以直接得到这个类的构造器对象:Constructor
·在运行时,可以直接得到这个类的成员变量对象:Field
·在运行时,可以直接得到这个类的成员方法对象:Method
·这种运行时动态获取类信息以及动态调用类中成分的能力称为Java语言的反射机制。
项目开发中常见的使用反射的场景
1.使用JDBC连接数据库
2.Servlet在Web容器中的加载和运行
2.反射的作用
Java反射机制提供了以下的功能:
1.在运行时获取类的修饰符,包名,类名,实现的接口,继承的父类
2.在运行时获取类的所有属性名,修饰符,属性类型
3.在运行时获取所有方法,方法的返回值类型,方法名,方法参数数量,方法参数类型
4.在运行时调用加载类的方法
·在运行时判断任意一个对象所属的类
·在运行时构造任意一个类的对象
·在运行时判断任意一个类所具有的成员变量和方法
·在运行时获取泛型信息
·在运行时调用任意一个对象的成员变量和方法
·在运行时处理注解
·生成动态代理
3.java反射API常用的类
java.lang.Class
java.lang.reflect.Method
java.lang.Constructor
java.lang.Field
java.lang.Modifier
4.Java反射相关的重要概念
·Class 类:Class类是反射的核心类,可以通过它获取类的信息。
·反射获取类信息:使用反射可以获取类的名称、修饰符、父类、接口、构造方法、字段、方法等信息。
·创建对象:使用反射可以动态地创建类的实例,包括调用无参构造方法和有参构造方法。
·调用方法:使用反射可以调用类的方法,包括公共方法、私有方法、静态方法等。
·访问属性:使用反射可以读取和修改类的属性,包括公共属性和私有属性。
·动态代理:使用反射可以实现动态代理,动态生成代理类来实现特定接口的方法调用。
代码:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws Exception {
// 获取类的Class对象
Class<?> clazz = Person.class;
// 获取类的名称
String className = clazz.getName();
System.out.println("Class Name: " + className);
// 获取类的修饰符
int modifiers = clazz.getModifiers();
System.out.println("Modifiers: " + modifiers);
// 获取类的父类
Class<?> superClass = clazz.getSuperclass();
System.out.println("Superclass: " + superClass.getName());
// 获取类实现的接口
Class<?>[] interfaces = clazz.getInterfaces();
for (Class<?> anInterface : interfaces) {
System.out.println("Interface: " + anInterface.getName());
}
// 获取构造方法
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
// 创建对象
Person person = (Person) constructor.newInstance("John", 25);
System.out.println("Person: " + person);
// 获取字段
Field field = clazz.getDeclaredField("age");
// 修改属性值
field.setAccessible(true);
field.setInt(person, 30);
System.out.println("Person: " + person);
// 调用方法
Method method = clazz.getMethod("sayHello");
method.invoke(person);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void sayHello() {
System.out.println("Hello, I'm " + name);
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
反射获取了Person类的信息,包括类的名称、修饰符、父类、接口、构造方法等,并通过反射创建了Person类的实例。还使用反射修改了Person对象的属性值和调用了类的方法。
5.反射总结
1.Java反射机制是Java语言被视为准动态语言的关键特性
2.Java反射机制有优点也有缺点