前言
在 java 开发中有一个非常重要的概念就是java反射机制,也是java的重要特征之一。其主要是指程序可以访问、检测和修改它本身状态或行为的一种能力,通过反射可以调用私有方法和私有属性,大部分框架也都是运用反射原理的。 java 通常是先有类再有对象,有对象就可以调用方法或者属性, java 中的反射其实是通过 Class 对象来调用类里面的方法
反射可实现的功能
一个类有多个组成部分,例如:成员变量、方法、构造方法等,反射就是加载类,并解剖出类的各个组成部分。反射主要提供以下功能:
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 生成动态代理
Class类
在检查一个类之前,必须先获取其 Class 对象。通过获取 Class 对象,可将一个类的方法、变量、接口、类名、类修饰符等信息告诉运行的程序
获取 Class 有三种方式:
Class.forName("完整包名带类名")
对象.getClass()
任何类型.class
相关 api
获取完整的包名和类名
public class reflectTest {
public static void main(String[] args) throws Exception {
Class<User> userClass = User.class;
String name = userClass.getName();
System.out.println(name);
}
}
获取父类与实现的接口
public class reflectTest {
public static void main(String[] args) throws Exception {
Class<User> clazz = User.class;
// 获取父类
Class<?> parentClass = clazz.getSuperclass();
System.out.println(parentClass.getName());
// 获取接口
Class<?>[] interfaces = clazz.getInterfaces();
for (Class c : interfaces){
System.out.println(c.getName());
}
}
}
通过反射机制实例化对象
public class reflectTest {
public static void main(String[] args) throws Exception {
Class<User> clazz = User.class;
// 通过默认构造方法构造,通过setter赋值
// User user = clazz.newInstance();
// user.setUserName("tom");
// user.setPassword("123456");
// System.out.println(user);
// 通过构造函数赋值,前提是得知道构造函数参数个数与类型,以及在构造函数数组的索引
Constructor<?>[] constructors = clazz.getConstructors();
// 索引0:无参
// 索引1:全参
Object user = constructors[1].newInstance("tom", "123");
System.out.println(user);
}
}
获取属性名、类型、访问修饰符
public class reflectTest {
public static void main(String[] args) throws Exception {
Class<User> clazz = User.class;
Field[] declaredFields = clazz.getDeclaredFields();
for (Field f : declaredFields) {
// 访问修饰符
int modifiers = f.getModifiers();
String modifierType = Modifier.toString(modifiers);
// 类型
Class<?> type = f.getType();
System.out.println(f.getName() + "---" +type.getName() + "---" + modifierType);
}
}
}
获取某个类的全部方法
public class reflectTest {
public static void main(String[] args) throws Exception {
Class<User> clazz = User.class;
Method[] methods = clazz.getMethods();
}
}
通过 for 循环获得每个方法的 Method 对象后,可以通过getModifiers
获取访问修饰符,通过getReturnType
获取返回值类型,通过getParameterTypes
获取参数类型,
通过getName
获取方法名,通过getExceptionTypes
获取可抛出异常类型
通过反射机制调用某个类的方法
public class reflectTest {
public static void main(String[] args) throws Exception {
Class<User> clazz = User.class;
// 参数1为方法名
Method method = clazz.getMethod("saySomething", String.class);
// 参数2为方法要求参数
method.invoke(clazz.newInstance(),"hello");
}
}
通过反射机制操作某个类的属性
public class reflectTest {
public static void main(String[] args) throws Exception {
Class<User> clazz = User.class;
User user = clazz.newInstance();
Field userNameField = clazz.getDeclaredField("userName");
// 如果操作private属性需要设置为true
userNameField.setAccessible(true);
userNameField.set(user,"tom");
System.out.println(user);
}
}
参考内容
java反射机制深入理解剖析
原创文章,作者:,如若转载,请注明出处:https://blog.ytso.com/273777.html