详解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)) ;


目录
相关文章
|
5天前
|
安全 Java API
Java反射(Reflection)的技术性文章
Java反射(Reflection)的技术性文章
20 1
|
21天前
|
Java C++
Java反射的简单使用
Java反射的简单使用
25 3
|
21天前
|
Java
【专栏】Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
4天前
|
缓存 安全 Java
【Java——反射机制详解】
RTTI(Run-Time Type Identification)运行时类型识别。在《Thinking in Java》一书第十四章中有提到,其作用是在运行时识别一个对象的类型和类的信息。主要有两种方式:一种是“传统的”RTTI,它假定我们在编译时已经知道了所有的类型;另一种是“反射”机制,它允许我们在运行时发现和使用类的信息。 反射就是把java类中的各种成分映射成一个个的Java对象 例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
|
6天前
|
JSON Java 数据库连接
Java的反射
Java的反射
|
19天前
|
安全 Java API
JAVA-不安全的反射--RCE
JAVA不安全的反射造成的RCE小案例
|
21天前
|
SQL 存储 Java
【Java反射详解】
【Java反射详解】
16 1
|
21天前
|
Java
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识
【5月更文挑战第2天】JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识。入坑JAVA因它的面向对象特性、平台无关性、强大的标准库和活跃的社区支持。
43 2
|
21天前
|
Java 测试技术
滚雪球学Java(24):Java反射
【4月更文挑战第13天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
24 0
滚雪球学Java(24):Java反射
|
21天前
|
Java
Java 反射
Java 反射