什么是反射?
简单的说:剖析java类中的各个组成部分,映射成一个个java对象。
在java.lang.reflect中。
反射用在哪?
多用于框架和组件,利用反射技术写出复用性高的通用程序
我只列出了反射中几个常用的API
类 Class
构造方法 Constructor
成员变量 Field
方法 Method
1.class 字节码文件
可以获得这个类的所有的特性
如何得到某个class类文件对应的class对象?
.已知类和对象的情况下:
类名.class
对象.getClass();
.未知类和对象的情况下:
Class.forName("包名.类名");
forName用于加载类字节码到内存中,并封装成一个Class对象
例:
// 获得一个.class 字节码文件 对应Class类对象
@Test
public void demo1() throws ClassNotFoundException {
// 已知类情况下 获得字节码对象
Class c1 = ClassTest.class;
// 已知一个对象,但是不知道这个对象属于哪个类,获得字节码对象
Object o = new ArrayList();
Class c2 = o.getClass(); // 等价于 ArrayList.class
// 未知类和对象情况下
String classDescription = "action.ClassTest";
Class c3 = Class.forName(classDescription);
}
2.Constructor
constructor类的实例对象代表类的一个构造方法
.得到某个类所有的构造方法
Constructor[] constructor = Class.forName("java.lang.String").getConstructor();
.得到制定的构造方法并调用
Constructor constructor = Class.forName("java.lang.String").getConstructor(String.class);
String str = (String)constructor.newInstance("abc");
Class类的newInstance()方法用来调用类的默认构造方法
String obj = (String)Class.forName("java.lang.String").newInstance();
例
:
// 调用指定构造方法
@Test
public void demo3() throws ClassNotFoundException, SecurityException,
NoSuchMethodException, IllegalArgumentException,
InstantiationException, IllegalAccessException,
InvocationTargetException {
// 已知类情况下,通过new 创建实例
ClassTest classTest = new ClassTest(10);
// 1. 获得字节码对象
Class c = Class.forName("action.ClassTest");
// 2. 获得指定构造方法
Constructor constructor = c.getConstructor(int.class);
// 3、调用构造方法 获得对象
Object o = constructor.newInstance(10);
}
3.Field
Field类代表某个类中的一个成员变量,并提供动态的访问权限
Field对象的获取:
.得到所有的成员变量
Field[] field = c.getField();// 取得所有Public属性
Field[] field = c.getDeclaredFields(); //取得所有声明的属性(包括私有)
.得到指定的成员变量
Field name =c.getField("name");
Field name =c.getDeclaredField("name");//私有
.设置Field变量是否可以访问
field.setAccessible(boolean);
.Field变量值的读取设置
field.get(obj);
field.set(obj,value);
例:
@Test
public void demo1() throws ClassNotFoundException, SecurityException,
NoSuchFieldException, InstantiationException,
IllegalAccessException {
// 以前方法操作变量
FieldMethodTest fieldMethodTest = new FieldMethodTest();
fieldMethodTest.num = 10;
// 1、获得字节码文件
Class c = Class.forName("cn.itcast.reflect.FieldMethodTest");
// 2、获得num成员变量 对应反射对象 Field
Field[] fields = c.getFields(); // 获得所有public属性
System.out.println(fields.length);
Field[] fields2 = c.getDeclaredFields();
System.out.println(fields2.length);
Field field = c.getDeclaredField("num");
// 3. 为num 赋值
Object o = c.newInstance(); // 调用默认构造方法
// 修改私有变量是 可见的
field.setAccessible(true);
field.set(o, 20);
System.out.println(field.get(o));
}
4. Method:
Method 和Field基本雷同 这里贴出例子
@Test
public void demo2() throws ClassNotFoundException, InstantiationException,
IllegalAccessException, SecurityException, NoSuchMethodException,
IllegalArgumentException, InvocationTargetException {
// 以前方式
FieldMethodTest fieldMethodTest = new FieldMethodTest();
fieldMethodTest.m("001");
// 1. 获得Class对象
Class c = Class.forName("action.FieldMethodTest");
// 2、获得对象
Object o = c.newInstance();
// 3. 获得m对象反射中Method对象
Method m = c.getMethod("m", String.class);
// 4. 调用o对象m方法
m.invoke(o, "008");
}
分享到:
相关推荐
JavaSE 高级反射-JVM篇
JavaSE反射详解
javaSE 反射详解。
JavaSE反射技术是Java编程语言中的一个重要特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这种动态类型的能力使得Java在处理未知类或接口时具有很大的灵活性,尤其在框架和库的开发中发挥着关键...
除此之外,JavaSE还包含异常处理、多线程、反射、枚举、注解、包装类、日期时间API、正则表达式等诸多内容。异常处理能帮助我们编写健壮的代码,通过捕获和处理错误来避免程序意外终止。多线程则使得Java程序能够在...
JavaSE还包括反射机制,允许在运行时检查类的信息并动态创建对象,这在框架和插件系统中非常有用。 线程是Java并发编程的基础,Java提供了Thread类和Runnable接口来创建和管理线程。线程池和并发工具类(如...
JavaSE常见面试题-高级反射-JVM篇 本文档涵盖了JavaSE中高级反射和JVM相关的知识点,包括Java中的反射机制、动态代理、设计模式、回收机制、JDK7和JDK8的区别、Jvm虚拟机原理等。 一、 Java中的反射机制 Java中的...
JavaSE还包含反射和动态代理等高级特性。反射允许我们在运行时检查类的信息,甚至修改其行为。动态代理则可以在运行时创建接口的实现类,常用于AOP(面向切面编程)。 最后,JavaSE的API非常丰富,如 Swing 和 AWT ...
JavaSE还包括了反射API,允许程序在运行时检查类的信息,如类名、方法、字段等,甚至动态调用方法或改变对象状态。泛型是JavaSE 5.0引入的新特性,增强了类型安全,减少了类型转换的麻烦。 总的来说,JavaSE是Java...
除此之外,JavaSE还包含丰富的内置类库,如集合框架(ArrayList、LinkedList、HashMap、HashSet等)、I/O流(用于文件读写和网络通信)、线程处理(实现多任务并行执行)、反射API(在运行时动态访问类的信息)等。...
2. **JavaSE基础知识总结之二**: - **集合框架**:ArrayList、LinkedList、HashSet、HashMap等容器的特性与使用场景,以及泛型的概念。 - **接口与内部类**:接口的定义与实现,静态与非静态内部类,匿名内部类的...
10. 注解与反射:通过使用注解和反射技术,可以实现元编程,增强代码的灵活性和可扩展性。 11. 序列化:学习如何序列化和反序列化对象,以便持久化数据或在网络间传输。 12. 泛型:泛型提供了类型安全,项目中可能...
JavaSE(Java Standard Edition)是Java开发平台的一个版本,主要用于桌面应用和服务器端开发。它提供了基础的Java编程环境,包括核心类库、JVM(Java虚拟机)以及开发工具。在JavaSE中,开发者可以学习到如何创建、...
JavaSE,全称为Java Standard Edition,是Java平台的标准版,主要面向桌面应用和服务器端开发。这个压缩包“javase笔记.7z”显然包含了关于JavaSE的学习笔记,可能包括了核心概念、语法、API使用等内容。下面我们将...
通过`@interface`定义注解,使用反射API获取注解信息,可以用于代码的验证、配置、性能监控等多种用途。 这个项目旨在通过实践来检验和巩固以上各个JavaSE技术点的理解和应用能力。开发者可以通过阅读和运行代码,...
JavaSE,全称为Java Standard Edition,是Java平台的标准版,主要面向桌面应用和服务器端开发。它是学习Java编程的基础,提供了构建其他Java平台(如JavaEE和JavaME)的基石。本课件“JavaSE课件JavaSE课件”旨在为...
8. **反射**:反射允许程序在运行时检查类的信息,创建和调用对象,是实现动态代理、元数据处理等功能的基础。 9. **枚举与注解**:枚举提供了一种安全的方式来表示有限的常量集合,注解则是元数据的一种形式,可以...
- 反射机制和设计模式的扩展知识。 #### 三、总结 JavaSE作为Java技术体系中的核心部分,不仅提供了学习JavaEE的基础,也为后续深入到其他领域(如Android应用开发)打下了坚实的技术根基。通过本课程的学习,...
此外,JavaSE还包括反射、注解、枚举、泛型等特性。反射允许程序在运行时动态获取类的信息并操作对象,注解可以用于元数据,提供编译时和运行时的元信息,枚举类型增强了常量的定义,泛型则提供了类型安全的容器,...
7. **反射**:Java反射机制允许在运行时检查类的信息,动态创建对象和调用方法,是实现元编程的重要工具。 8. **泛型**:泛型增强了类型安全,允许在编译时检查类型,减少强制类型转换。 9. **枚举**:Java的枚举...