Java反射

简介: Java反射

反射:将各类的各个组成部分封装为其它对象,这就是反射机制.


好处:


1.可以在程序运行过程中操作这些对象


2.可以解耦,提高程序的扩展性


15616626-7e86396e0e8b9705.png


Java代码在计算机中经历的阶段


获取class对象的方式:



1.class.forName("全类名"):将字节码文件加载进内存,返回class对象(静态方法),多用于配置文件,将类名定义在配置文件中,读取文件,加载类.


2.类名.class,通过类名的属性来进行class获取,多用于参数的传递(已经在内存中了)

3.对象.getclass(),这个方法在object类中定义,所有类继承object类,对用于对象获取字节码的方式.


结论:同一个字节码文件在一次程序运行中,只会被加载一次,无论通过哪一种方式进行获取的class,对象都是同一个.


Class对象的功能



获取功能:


1.获取成员变量们


Fieid  getField(String name)    返回一个 Field对象,获取被public修饰的指定成员变量


Fieid[] getFields()  返回包含一个数组 ,获取被public修饰的所有的成员变量


Fieid getDeclaredField(String name) 返回一个 Field对象,获取指定的的成员变量


Fieid[] getDeclaredField()返回一个包含数组,获取所有的成员变量


2.获取构造方法


Constructor<>[] getConstructors()
Constructor getConstructor(类<?>...parameterTypes)
Constructor  getDeclaredConstructor(类<?>...parameterTypes)
Constructor[] getDeclaredConstructors()


3.获取成员方法们


Method[] getMethods()
Method getMethod(String name,类<?>...parameterTypes)
Method[]  getDeclearedMethods()
Method  getDeclearedMethod(String name,类<?>...parameterTypes)


4.获取类名


String getName()


注意:获取不是被public修饰时,必须忽略访问权限修饰符的安全检查, setAccessible(true)暴力反射 默认为false.

Field:成员变量


操作:


1.设置值  void set(Object obj,Object value) 必须传入对象


2.获取值 get(Object obj)


Constructor:构造方法 构造方法的作用就是进行对象创建


创建对象: newInstance(Object...initargs )


如果使用空参构造方法创建对象的话,操作可以简化:class对象的 newInstance方法

Method:方法对象


执行方法:


Object invoke(Object obj,object...args)

获取方法名称:String getName


使用反射知识进行框架机制模拟



需求分析


在不改变任何代码的前提下,可以帮我们创建任意类,并调用其中任意的方法实现


1.配置文件


2.反射


步骤:


1.将需要创建的全类名和需要执行的方法定义在配置文件中

2.在程序中加载读取配置文件

3.使用反射技术加载文件进入内存

4.创建文件

5.执行方法


代码如下:



package reflect;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
/*
• 框架类
*/
public class reflectTest {
public static void main(String[] args) throws Exception {
// 加载配置文件
    // 1.1创建properties对象
    Properties pro = new Properties();
    // 1.2加载配置文件,将其转化为一个集合
    // 1.21获取文件的路径
    ClassLoader classloader = reflectTest.class.getClassLoader();// 获取类加载器
    InputStream is = classloader.getResourceAsStream("pro.properties");// 加载到内存中
    pro.load(is);// 使properties转化为集合形式
    // 2.获取配置文件的定义的数据
    String className = pro.getProperty("className");
    String methodName = pro.getProperty("methodName");
    //3.加载该类进内存
    Class personclass=Class.forName(className);
    //4.创建对象
    Object obj=personclass.newInstance();
    //5.获得方法
    Method method=personclass.getDeclaredMethod(methodName);
    //6.执行方法
    method.invoke(obj);
}
}



image.png

配置文件内容



Person类代码
package reflect;
public class Person {
public int age;
private String name;
public Person() {
}
public Person(int age,String name) {
    this.age=age;
    this.name=name; 
}
public void eat() {
    System.out.println("吃饺子");
}
}


image.png

执行结果


学习反思:Java是oop思想,而反射是对一些运行中程序的操控,通过类加载器以及io流对字节码文件进行内外存转换,在反射当中,成员变量、构造器以及方法都成为了对象,我们可以通过反射技术进行对其操控,做到万物皆对象这一思想.



相关文章
|
8天前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
14 2
|
1月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
50 9
Java——反射&枚举
|
1月前
|
安全 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版)
|
6天前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
7 0
|
1月前
|
Java 程序员 编译器
Java的反射技术reflect
Java的反射技术允许程序在运行时动态加载和操作类,基于字节码文件构建中间语言代码,进而生成机器码在JVM上执行,实现了“一次编译,到处运行”。此技术虽需更多运行时间,但广泛应用于Spring框架的持续集成、动态配置及三大特性(IOC、DI、AOP)中,支持企业级应用的迭代升级和灵活配置管理,适用于集群部署与数据同步场景。
|
1月前
|
存储 安全 Java
扫盲java基础-反射(一)
扫盲java基础-反射(一)
|
1月前
|
Java
扫盲java基础-反射(二)
扫盲java基础-反射(二)
|
3月前
|
安全 Java 测试技术
day26:Java零基础 - 反射
【7月更文挑战第26天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
33 5
|
2月前
|
缓存 安全 Java
【Java 第十篇章】反射
Java 反射技术让程序能在运行时动态获取类信息并操作对象,极大提升了灵活性与扩展性。本文将介绍反射的基本概念、原理及应用,包括如何使用 `Class`、`Field`、`Method` 和 `Constructor` 类进行动态操作。此外,还将探讨反射在动态加载、框架开发与代码测试中的应用场景,并提醒开发者注意性能与安全方面的问题,帮助你更合理地运用这一强大工具。
24 0
|
3月前
|
IDE Java 测试技术
Java进阶之反射
【7月更文挑战第14天】Java反射机制允许在运行时动态获取类信息、创建对象及调用其方法。它基于`Class`类,让我们能访问类的属性、方法、构造器。例如,通过`Class.forName()`加载类,`Class.newInstance()`创建对象,`Method.invoke()`执行方法。反射广泛应用于动态代理、单元测试、序列化及框架中,提供灵活性但牺牲了性能,且可破坏封装性。IDE的代码补全也是反射的应用之一。在使用时需谨慎,避免对私有成员的不当访问。
36 1