JAVA反射详解

本文深入探讨了Java反射机制,包括如何通过反射获取类的成员结构、动态调用方法和设置属性值。介绍了四种获取Class对象的方法,并展示了反射在获取类信息、字段、方法和构造器方面的基本操作。同时,指出了反射带来的性能下降和安全隐患,以及其在代码灵活性和复用性上的优势。
摘要由CSDN通过智能技术生成

定义:

    指在JAVA程序运行状态中:

        ①给定的一个类(Class)对象,通过反射获取这个类(Class)对象的所有成员结构;

        ②给定的一个具体对象,能够动态地调用它的方法及对任意属性值进行获取和复制

    这种动态获取类的内容,创建对象,以及动态调用对象的方法及操作属性的机制

反射的特点——优劣势:

    优势

        增加程序的灵活性,避免将固有的逻辑程序写死到代码里

        代码简洁,可读性强,科提高代码的复用率

    缺点

        相对直接调用,在量大的情境下反射性能下降

        存在一些内部暴露和安全隐患

获取java.lang.Class字节码对象的四种方法:

//通过类获取
Class clazz1 = GPDispatcherServlet.class;
//通过对象获取
Class clazz2 = new GPDispatcherServlet().getClass();
//通过Class.forName()方法获取
Class clazz3 = Class.forName("mvcframework.servlet.GPDispatcherServlet");
//通过类加载器获取
Class clazz4 = GPDispatcherServlet.class.getClassLoader().loadClass("mvcframework.servlet.GPDispatcherServlet");

反射-基本信息操作:

//获取类的修饰符
int modifiers = clazz.getModifiers();
//获取类的包名
Package clazzPackage = clazz.getPackage();
//获取类的全路径名称
String name = clazz.getName();
//获取类的简单名称
String simpleName = clazz.getSimpleName();
//获取类的类加载器
ClassLoader classLoader = clazz.getClassLoader();
//获取类实现的接口列表
Class[] interfaces = clazz.getInterfaces();
//获取类的父类
Class superclass = clazz.getSuperclass();
//获取类的注解列表
Annotation[] annotations = clazz.getAnnotations();

反射-字段操作:

//获取类中所有的公有字段,包含继承的直接父类及所有的间接父类
Field[] fields = clazz.getFields();
//获取类中定义的字段(本类的内部的字段,包含私有的字段)
Field[] declaredFields = clazz.getDeclaredFields();
//获取指定名称的公有字段
Field field = clazz.getField("test");
//获取指定名称的本类中定义的字段
Field declaredField = clazz.getDeclaredField("test");
//获取字段的修饰符
int fieldModifiers = field.getModifiers();
//获取字段强制访问权限(当字段的访问权限为private时需要)
field.setAccessible(true);
//成员字段赋值(需要指定对象)
declaredField.set(testObject,"testString");
//静态字段赋值(无需指定对象)
staticField.set(null,"testString");

反射-方法操作:

//获取类中所有的公有方法(包含继承的方法)
Method[] methods = clazz.getMethods();
//获取类中定义的方法(仅限于本类,包含private方法)
Method[] declaredMethods = clazz.getDeclaredMethods();
//获取类中指定名称和参数的公有方法(包含继承的方法)
Method method = clazz.getMethod("toString",String.class);
//获取类中定义指定名称和参数的方法(包含本类的私有方法)
Method declaredMethod = clazz.getDeclaredMethod("main", String[].class);
//获取方法的修饰符
int methodModifiers = method.getModifiers();
//指定对象进行成员方法的调用
method.invoke(testObject,"arg1","arg2");
//指定方法的强制访问
method.setAccessible(true);
//静态方法调用
declaredMethod.invoke(null);

反射-构造器操作:

//获取类中所有的公有构造器
Constructor[] constructors = clazz.getConstructors();
//获取类中所有的构造器
Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
//获取类中无参的构造器
Constructor declaredConstructor = clazz.getDeclaredConstructor();
//获取类中有惨构造
Constructor clazzDeclaredConstructor = clazz.getDeclaredConstructor(String.class);
//获取构造器的修饰符
int constructorModifiers = declaredConstructor.getModifiers();
//构造器实例对象
Object o = declaredConstructor.newInstance();
//指定构造器的强制访问
declaredConstructor.setAccessible(true);
//有参构造调用
Object o1 = clazzDeclaredConstructor.newInstance("test");
//class直接调用默认无参构造
Object o2 = clazz.newInstance();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值