Java的反射demo,用来理解反射的全过程
package com.ljquan.test.utils;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @className ReflectionDemo
* @Description:
* @Author ljquan
* @Date 2022/05/01 16:55:34
* @Version 1.0.0
*/
public class ReflectionDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
//反射访问属性
getClassTest();
//反射访问方法
getClassMethod();
//反射创建对象
getClassConstructor();
//
accessToParentClassInterface();
}
/**
* 通过反射访问一个对象的属性测试
*
* @throws ClassNotFoundException 类没有发现异常
*/
public static void getClassTest() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {
String pojoPath = "com.ljquan.test.pojo.User";
Class<?> user = Class.forName(pojoPath);
String name = user.getName();
//创建一个实例 userTest现在是一个对象
Object userTest = user.newInstance();
//获取公共区域属性
Field id = user.getDeclaredField("test");
id.set(userTest, "1001");
System.out.println(id.get(userTest));
// 获取私有属性
//获取公共区域属性
Field id1 = user.getDeclaredField("id");
//打破封装
id1.setAccessible(true);
id1.set(userTest, 1002);
System.out.println(id1.get(userTest));
}
public static void getClassMethod() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
System.out.println("===============");
String pojoPath = "com.ljquan.test.pojo.User";
//获取类
Class<?> userClass = Class.forName(pojoPath);
String name = userClass.getName();
//创建一个实例 userTest现在是一个对象
Object userTest = userClass.newInstance();
//获取类中的方法
Method test = userClass.getMethod("test");
//Method[] declaredMethods = userClass.getDeclaredMethods();
//调用
Object invoke = test.invoke(userTest);
System.out.println(invoke);
}
/**
* 得到类构造函数 通过反射机制创建一个对象
*/
public static void getClassConstructor() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
System.out.println("===============获取无参构造方法创建一个对象");
String pojoPath = "com.ljquan.test.pojo.User";
//获取类
Class<?> userClass = Class.forName(pojoPath);
//获取无参构造方法创建一个对象
Constructor<?> constructor = userClass.getConstructor();
//创建一个实例 userTest现在是一个对象
Object userTest = constructor.newInstance();
System.out.println(userTest);
//有参函数创建一个对象
System.out.println("========有参函数创建一个对象");
Constructor<?> constructor1 = userClass.getConstructor(Integer.class, String.class, String.class, String.class);
Object o = constructor1.newInstance(1, "23", "34", "3");
System.out.println(o);
}
/**
* 访问父类接口
*/
public static void accessToParentClassInterface() throws ClassNotFoundException {
System.out.println("=======当前对象的父类的接口");
String pojoPath = "com.ljquan.test.pojo.User";
//获取类
Class<?> userClass = Class.forName(pojoPath);
Class<?> superclass = userClass.getSuperclass();
System.out.println(superclass.getName());
Class<?>[] interfaces = superclass.getInterfaces();
for (Class<?> anInterface : interfaces) {
System.out.println(anInterface.getName());
}
}
}
输出:
1001
1002
===============
true
===============获取无参构造方法创建一个对象
User(id=null, email=null, name=null, test=null)
========有参函数创建一个对象
User(id=1, email=23, name=34, test=3)
=======当前对象的父类的接口
java.lang.Object
Process finished with exit code 0