详解JAVA反射

简介: 1.概述反射,JAVA提供的一种在运行时获取类的信息并动态操作类的能力。JAVA反射允许我们在运行时获取类的属性、方法、构造函数等信息,并能够动态地操作它们。2.获取Class对象

1.概述

反射,JAVA提供的一种在运行时获取类的信息并动态操作类的能力。JAVA反射允许我们在运行时获取类的属性、方法、构造函数等信息,并能够动态地操作它们。

2.获取Class对象

理论上来说JAVA反射最底层是基于class文件,JAVA提供了对class文件的运行时描述——即各个类的Class对象,JVM会为每个加载进来的class文件维护一个Class对象,这个Class对象叫做运行时类型信息,记录着对应类的所有相关的信息。


Class对象的获取方式:


1.通过Object类来获取


        Class<?> classType1=e.getClass();


2.通过Class类来获取

3.API

3.1.实例化对象

JAVA中有四种方式实例化对象:

  • new
  • clone
  • 序列化
  • 反射

利用反射实例化对象:

实体类:

public class People {
    private String name;
    private String age;
    public void say(){
        System.out.println("my name is "+name+"\t"+age+" years old");
    }
}

实例化:

try {
            //方式1
            People people = (People) Class.forName("com.eryi.People").newInstance();
            //方式2
//            Constructor<People> constructor=People.class.getConstructor();
//            People people= constructor.newInstance();
            people.say();
        } catch (Exception e) {
            e.printStackTrace();
        }

3.2.方法

JAVA提供Method类型来表示方法,Class类中方法相关的API如下:

classType.getMethods() 获取当前类以及父类的public方法
classType.getDeclareMethods() 获取当前类的所有方法
classType. getMethod(String name.Class<?>... parameterTypes) 获得当前类以及父类指定的public方法

classType. getDeclaredMethod(String name,Class<?>... parameterTypes)  获得当前类的指定的Method

代码示例:

注意:通过反射访问私有方法时要关闭安全检查。

//获取类对象
    Class<?> classType=Class.forName("reflection.emplee");
    //调带参构造实例化
    Constructor<?> constructor2=classType.getConstructor(new Class[]{String.class,int.class});
    emplee e3=(emplee)constructor2.newInstance(new Object[]{"张三",30});
    //获得指定方法
    Method method1=classType.getDeclaredMethod("toString",new Class[]{});
    String result1=(String)method1.invoke(e3, new Object[]{});
    System.out.println(result1);
    //获得全部方法(包括私有)
    Method[] methods=classType.getDeclaredMethods();
    for (Method m : methods) {
      System.out.println("方法名:"+m.getName()+"\t"+"返回值类型:"+m.getReturnType());
    }
    //调用私有方法
    Method method2=classType.getDeclaredMethod("getName",new Class[]{});
    //关闭安全检查
    method2.setAccessible(true);
    String result2=(String)method2.invoke(e3, new Object[]{});
    System.out.println(result2);

3.3.属性

JAVA提供Method类型来表示属性,Class类中与属性相关的API如下:

 classType. getFields() 获得当前类以及超类的public Field
classType. getDeclaredFields() 获得当前类申明的所有Field
classType. getField(String name) 获得当前类以及超类指定的public Field
 classType. getDeclaredField(String name) 获得当前类申明的指定的Field
field.set(Object obj, Object value) 通过反射动态设定Field的值
Object obj = field.get(Object obj) 通过反射动态获取Field的值

代码示例:

//获取class对象所指定的属性,包括私有的
Field field = classType.getDeclaredField("name");
//关闭安全检查
field.setAccessible(true);"李四") ;
field.set(employeeSystem.out.println(field.get (employee)) ;


目录
相关文章
|
2月前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
26 0
[Java]反射
|
3月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
67 9
Java——反射&枚举
|
2月前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
29 2
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
2月前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
17 0
|
3月前
|
Java 程序员 编译器
Java的反射技术reflect
Java的反射技术允许程序在运行时动态加载和操作类,基于字节码文件构建中间语言代码,进而生成机器码在JVM上执行,实现了“一次编译,到处运行”。此技术虽需更多运行时间,但广泛应用于Spring框架的持续集成、动态配置及三大特性(IOC、DI、AOP)中,支持企业级应用的迭代升级和灵活配置管理,适用于集群部署与数据同步场景。
|
3月前
|
存储 安全 Java
扫盲java基础-反射(一)
扫盲java基础-反射(一)
|
3月前
|
Java
扫盲java基础-反射(二)
扫盲java基础-反射(二)
|
5月前
|
安全 Java 测试技术
day26:Java零基础 - 反射
【7月更文挑战第26天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
36 5
|
4月前
|
缓存 安全 Java
【Java 第十篇章】反射
Java 反射技术让程序能在运行时动态获取类信息并操作对象,极大提升了灵活性与扩展性。本文将介绍反射的基本概念、原理及应用,包括如何使用 `Class`、`Field`、`Method` 和 `Constructor` 类进行动态操作。此外,还将探讨反射在动态加载、框架开发与代码测试中的应用场景,并提醒开发者注意性能与安全方面的问题,帮助你更合理地运用这一强大工具。
34 0