反射:
一、概念
就是加载类,把字节码文件加载到内存中,并允许以编程的方式解刨类中的各种成分(成员变量、方法、构造器)
二、java运行过程
java从源码到程序运行过程是java源程序到字节码文件,最后到运行结果的过程。
Java编译器将java源文件(.java)转换成字节码文件(.class),类加载器(ClassLoader)将字节码文件加载进内存,然后进行字节码校验,最后Java 解释器翻译成机器码。
三、获取类
1.获取Class对象的三种方式
(1)Class c1 = 类名.class
(2)调用Class提供方法:public static Class forName(String package);
Class c2 = Class.forName(“类路径”)
(3)Object提供的方法:public Class getClass();
Class c3 = 对象.getClass();
补充:反射第一步必须先得到这个类的Class对象,才能拿到这个类里面的东西。(成员变量、方法、构造器)
2.获取类的构造器
获取类的构造器作用:依然是初始化对象返回
package com.wt.test02;
public class Cat {
private String name;
private Integer age;
private Cat() {
}
public Cat(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package com.wt.test02;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.lang.reflect.Constructor;
@Slf4j
public class TestGetConstructor {
/*
* Constructor<?>[] getDeclaredConstructors() 获取全部构造器(只要存在就能获取)
* */
@Test
public void testGetDeclaredConstructors(){
//1.反射第一步必须先得到这个类的Class对象
Class catClass = Cat.class;
//2.获取全部构造器
Constructor[] constructors = catClass.getDeclaredConstructors();
//3.遍历数组中的每一个构造器
for (Constructor constructor : constructors) {
log.info(constructor.getName() + "-->" + constructor.getParameterCount());
}
}
/*
* Constructor<T> getDeclaredConstructors(Class<?> ...parameterTypes) 获取某个构造器(只要存在就能获取)
* */
@Test
public void testGetDeclaredConstructor() throws Exception {
//1.反射第一步必须先得到这个类的Class对象
Class catClass = Cat.class;
//2.获取无参构造器
Constructor constructor = catClass.getDeclaredConstructor();
log.info(constructor.getName() + "-->" + constructor.getParameterCount());
//初始化对象返回
constructor.setAccessible(true);// 禁止检查访问权限 破坏了 java单列模式的封装性
Cat cat = (Cat) constructor.newInstance();
System.out.println(cat);
//3.获取有参构造器
Constructor constructor2 = catClass.getDeclaredConstructor(String.class, Integer.class);//String.class:代表是String类型
log.info(constructor2.getName() + "-->" + constructor2.getParameterCount());
//初始化对象返回
constructor2.setAccessible(true);// 禁止检查访问权限 破坏了 java单列模式的封装性
Cat cat2 = (Cat) constructor2.newInstance("Tom",24);
System.out.println(cat2);
}
}