简易反射demo
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与class对象。
Class对象的由来是将class文件读入内存,并为之创建一个Class对象。
以下就是一个简易的反射demo
import com.liao.encryption.DesUtil;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 反射测试
*
* @Author liaopj 2022/3/23
*/
public class Reflection {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
//或者通过包路径获取Class对象
//Class<?> desUtilClass = Class.forName("com.liao.encryption.DesUtil");
//获取实例化对象
DesUtil DesUtil = DesUtil.class.getDeclaredConstructor().newInstance();
// 直接通过实例化对象获取Class对象
Class<?> desUtilClass = DesUtil.getClass();
//获取所有的成员方法,包括私有的(不包括继承的)
Method[] methods = desUtilClass.getDeclaredMethods();
for (Method method : methods){
System.out.println(method.getName());
}
//利用反射破坏私有机制
Method privateMethod = desUtilClass.getDeclaredMethod("getEncryptData",String.class);
privateMethod.setAccessible(true);
//需要两个参数,一个是要调用的对象(获取有反射),一个是实参
System.out.println(privateMethod.invoke(DesUtil,"123456"));
}
}
控制台输出:(打印反射对象中的全部方法名称和调用getEncryptData方法之后对"123456"加密后的结果)