什么是反射
一个类有多个组成部分,如成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分
Java反射机制主要提供以下功能
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法,生成动态代理
java反射所需要的类并不多,主要有java.lang.class类和java.lang.reflect包中的Field、Construct、Method、Annotation类。Class类是java的起源, 针对任何一个你想探勘的类,只有先为它产生一个Class类的对象,接下来才能通过Class对象获取其它想要的信息。
使用场景
主要用来编写一些通用率较高的代码,或编写框架的时候使用
反射常用类
- Class: java大类
- Constructor: 调用构造方法
- Field: 访问字段
- Method: 调用方法
1.获取类对象的方法
1.使用类
class clazz = Dog.class
2.使用全类名
class aclass = Class.forName("com.xinzhi.Day");
3.使用对象
Dog dog = new Dog();
class clazz = dog.getclass();
2.调用构造方法
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectionDemo {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
// 获取构造方法
Constructor constructor = StringBuffer.class.getConstructor(String.class);
// 调用构造方法
Object str = constructor.newInstance("Hello Imooc");
System.out.println(str);
}
}
3.访问字段
package com.imooc.reflect;
import java.lang.reflect.Field;
public class ImoocStudent1 {
// 昵称 私有字段
private String nickname;
// 余额 私有字段
private float balance;
// 职位 公有字段
public String position;
public static void main(String[] args) throws NoSuchFieldException {
// 类名.class 方式获取 Class 实例
Class cls1 = ImoocStudent1.class;
// 获取 public 的字段 position
Field position = cls1.getField("position");
System.out.println(position);
// 获取字段 balance
Field balance = cls1.getDeclaredField("balance");
System.out.println(balance);
// 获取所有字段
Field[] declaredFields = cls1.getDeclaredFields();
for (Field field: declaredFields) {
System.out.print("name=" + field.getName());
System.out.println("\ttype=" + field.getType());
}
}
}
4.调用方法
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectionDemo1 {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
// 实例化字符串对象
String name = new String("Colorful");
// 获取 method 对象
Method method = String.class.getMethod("replace", CharSequence.class, CharSequence.class);
// 调用 invoke() 执行方法
String result = (String) method.invoke(name, "ful", "");
System.out.println(result);
}
}
网友评论