0. 优质博客
- Java反射(超详细!)
-
1. 反射基础
1.1 概述
Java程序在运行时操作类中的属性和方法的机制,称为反射机制;
Reflection是Java被视为动态(或准动态)语言的一个关键性质。
作用: 反编译:.class —> .java。
- 通过反射机制运行时访问Java对象中的属性、方法、构造方法等。
//Class类和String类都是被final关键字修饰的类,是不可以被继承的类;
//Class类支持泛型T,也就是说在编写程序时可以做到:反射 + 泛型;
//Class类实现了序列化标记接口Serializable,既是Class类可以被序列化和反序列化;
//Class类不能被继承,同时唯一的一个构造器还是私有的,因为设计之初就是让JVM在类加载后传入ClassLoader对象来创建 Class对象(每个类或接口对应一个JVM自动生成Class对象),开发人员只是调用Class对象,并没有直接实例化Class的能力
public final class Class<T> implements java.io.Serializable, GenericDeclaration, Type, AnnotatedElement {
private final ClassLoader classLoader;
private Class(ClassLoader loader) {
classLoader = loader;
}
}
1.2 获取Class的3种方式
| 方式 | 备注 | | —- | —- | | Class.forName(“完整类名带包名”) | 返回值都是Class类型。静态方法 | | 对象.getClass() | 返回值都是Class类型。 | | 任何类型.class | 返回值都是Class类型。 |
java.lang.Class; //类
java.lang.reflect.Constructor;//构造方法
java.lang.reflect.Field; //类的成员变量
java.lang.reflect.Method;//类的方法
java.lang.reflect.Modifier;//访问权限
1.3 反射常用方法
getDeclaredConstructors(); //获取所有的构造函数
getDeclaredConstructor(参数类型); //获取一个所有的构造函数
getConstructors(); //获取所有公开的构造函数
getConstructor(参数类型); //获取单个公开的构造函数
getName(); //获取全名 例如:com.bean.Book
getSimpleName() //获取类名 例如:Book
getPackage(); //获取包,返回类型:package
getInterfaces(); // 获取实现接口,返回类型:Class[] interfaces
getSuperclass(); //获取父类/超类,返回类型:Class superclass
getMethods(); //获取所有公开的方法,注意:它会将系统自带的方法也得到
getMethod(String name); //获取单个公开的方法,参数是可以指定方法名
getDeclaredMethods() //获取所有的方法,注意:它不会获取系统自带的方法
getDeclaredMethod(String name) //获取单个的所有方法 参数是可指定方法名
getFields() //获取所有的公开字段
getField(String name) //参数可以指定字段 获取单个public字段
getDeclaredFields() //获取所有的字段
getDeclaredField(String name) //获取单个字段 参数可以指定字段
/**获取所有修饰符,返回类型:整数类型,如果有两个修饰符,则返回两个修饰符之和,
例如public static void getAll(){ }返回值会是public和static之和*/
/*整数定义:
0–默认不写/1–public/2–private/4–protected/8–static/16–final/
32–synchronized/64–volatile/128–transient/
256–native/512–interface/1024–abstract*/
getModifiers();
//第一种方法:newInstance()
Class clz = Book.class;
Object obj = clz.newInstance(); //将创建一个无参book对象
//第二种方法:构造函数
Class clz = Book.class;
Constructor constructor = clz.getDeclaredConstructor(); //获得无参构造
Object obj = constructor.newInstance(); //实例化book对象
//利用setAccessible操作私有成员变量、方法
clz.setAccessible(true) //可访问
clz.setAccessible(false) //不可访问
//默认是false
Field id = clz.getField("age"); //age字段
id.setAccessible(true); //设为可访问
id.setAccessible(false); //设为不可访问
//method.invoke(Object obj,Object... args)
//obj:如果是实例方法,则放个该方法的类对象给它;如果是静态方法,写null
//args:方法的参数值,没有写null,或不写都行
Method method = clz.getMethod("printAll"); //获取单个的公开方法
method.invoke(clz.newInstance(),null); //使用方法