反射
1.1什么是反射
就是使用类的另一种方式
反射使用类的方式:
要使用反射就需要把一个类的字节码文件加载到内存中,加载到内存中JVM就会为这个字节码文件生成一个class对象,这个class对象就是对这个字节码文件的描述,一个class文件中包含了,构造方法,成员变量,成员方法
在Java语言中万物皆对象所以 ,构造方法,成员变量,成员方法都是对象,
Java也提供了对应的类对其描述:Constructor,Field,Method,获取到对应成员对象就可以调用成员中的方法
反射学习思路
首先获取一个类的字节码文件
调用字节码文件对象的方法获取指定成员 Constructor,Field,Method
调用对应的成员对象的方法使用类中的成员
1.2 获取Class对象
三种方式:
通过类中静态方法forName()
通过类的class (例如:Student.class)
通过对象调用(例如:Student stu = Student(); stu.getClass())
1.3获取构造方法
常用:
public Constructor getDeclaredConstructor(Class<?>… parameterTypes)
parameterTypes:表示的是构造方法参数对应的Class类型
Class c= Class.forName("com.itheima.myreflect3.Student");
Constructor constructor = c.getDeclaredConstructor(String.class);
System.out.println(constructor);
1.3.1使用构造方法对象
作用:用来创建对象
Constructor类中的方法
public T newInstance(Object … initargs) // 创建对象
initargs: 表示的就是给构造方法所传递的具体的数据(实际参数)
创建对象
constructor.newInstance()
1.3.2获取成员变量并使用
常用:
public Field getDeclaredField(String name) // name参数表示的就是成员变量的名称
1.获取name成员变量
Field field = clazz.getDeclaredField(“name”);
//强行获取私有属性
field .setAccessible(true);
2.
给成员变量设置值
public void set(Object obj, Object value)
获取成员变量值
public Object get(Object obj)
Class c = Class.forName("test.Student");
Constructor constructor = c.getDeclaredConstructor();
Field ss = c.getDeclaredField("name");
Field age = c.getDeclaredField("age");
ss.setAccessible(true);
age.setAccessible(true);
Student stu = (Student) constructor.newInstance();
ss.set(stu,"张三");
System.out.println(stu);
Object o = ss.get(stu);
System.out.println(o);
1.3.3获取成员方法并使用
常用:
public Method getDeclaredMethod(String name, Class<?>… parameterTypes)
name:表示的是成员方法的名称
parameterTypes:表示的就是成员方法参数类型所对应的Class类型
使用方法(调用)
public Object invoke(Object obj, Object… args)
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
// Object invoke(Object obj, Object... args):运行方法
// 参数一:用obj对象调用该方法
// 参数二:调用方法的传递的参数(如果没有就不写)
// 返回值:方法的返回值(如果没有就不写)
//1.获取class对象
Class clazz = Class.forName("test.Student");
//2.获取里面的Method对象 function4
Method method = clazz.getMethod("function4", String.class);
//3.运行function4方法就可以了
//3.1创建一个Student对象,当做方法的调用者
Student student = (Student) clazz.newInstance();
//3.2运行方法
Object result = method.invoke(student, "zhangsan"); // 通过student对象调用function4这个方法,将zhangsan作为方法参数传递过去
//4.打印一下返回值
System.out.println(result);
}