目录
(3)Class.forName("类名全路径").var (用的最多)
一、反射(Reflect)
反射:是一种java提供的专门技术,该技术主要通过字节码文件实现对相关Java类进行各种操作(把Java中的各个组成部分映射成相应的Java类。),反射是一种非常强大的技术,广泛应用在框架中(mybatis、spring全家桶)。
一个类的组成部分包括:属性、方法、构造方法、包等。
Class类定义了一系列的方法来获取Java类的属性、方法、构造方法、包等信息,这些信息都有相应的类来表示,分别是Field、Method、Constructor、Package等。
注意:表示Java类的组成部分的各种类位于java.lang.reflect包里。
二、Class对象的获取方式
Class类的对象就是不同的类对应的字节码。
通过反射创建对象:
字节码对象.newInstance(); //该方法相当于直接反射无参的构造(包括私有的)
通过反射获取构造器(函数) : DeclaredXXX表示获取该类的自定义成员,没有Declared的表示获取所有的能够访问到的成员(包括父类的)
字节码对象.getDeclaredConstructor()
字节码对象.getDeclaredConstructors()
字节码对象.getConstructors()
获取Class对象一般有三种方式:
(1)通过对象类获取字节码
对象名.getClass(),是Object类的方法
Person p1 = new Person();
p1.getClass();
@Test
public void test02(){
User user = new User();
Class< User> clazz = (Class<User>) user.getClass();
//获取User对象的构造函数
Constructor<?>[] constructors = clazz.getConstructors();
for (int i = 0; i < constructors.length; i++) {
Constructor<?> constructor = constructors[i];
System.out.println(constructor);
}
try {
Constructor<User> constructor = clazz.getConstructor(Integer.class ,String.class);
User user1 = constructor.newInstance(1, "张三");
System.out.println(user1);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
(2)如果有类名称,通过 类名称.class 获取
@Test
public void test() throws IllegalAccessException, InstantiationException {
Class<User> userClass = User.class;
User user = userClass.newInstance();
user.setName("张三");
user.setAge(18);
user.setId(123456);
user.setAddress("上海");
System.out.println(user);
}
(3)Class.forName("类名全路径").var (用的最多)
Class.forName("java.lang.String");
对象是类创建的,同一个类的不同对象具有不同的属性值。
Java中定义的所有类都属于同一种事物,可以用Class来表示。
@Test
public void test03(){
try {
//这里必须是类的全包名
Class<?> clazz = Class.forName("com.zh.javase.User");
Constructor<?> constructor = clazz.getConstructor();
User user = (User) constructor.newInstance();
user.setName("张三");
user.setAge(18);
user.setId(123456);
user.setAddress("上海");
System.out.println(user);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
获取无参构造方法-----Void.class
Modifier类中有所有关键字对应的值
三、基本数据类型的Class对象
8个基本数据类型:int、boolean、short、byte、char、long、float、double
它们有各自的Class对象
eg:int.class
void.class
基本数据类型对应的封装类有属性TYPE,这个属性代表了封装了 封装类 所封装的基本数据类型的 Class对象。
int.class===Integer.TYPE
void.class===Void.TYPE