Java的反射机制
时间:2020-04-12
本文章向大家介绍Java的反射机制,主要包括Java的反射机制使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
反射的概述
ClassLoader将.class文件加载到JVM中
反射常用对像的概述
反射的API
1 Class类
实体类
View Code
测试类
推荐第三种方式
1 package com.imooc.reflect.test; 2 3 import org.junit.Test; 4 5 /** 6 * 7 * @author jt 8 * 9 */ 10 public class ClassTest { 11 12 @Test 13 /** 14 * 获得Class对象 15 * * 1.通过类名.class 16 * * 2.对象.getClass() 17 * * 3.Class.forName(); 18 */ 19 public void demo1() throws ClassNotFoundException{ 20 // 1.通过类名.class的方式 21 Class clazz1 = Person.class; 22 // 2.通过对象.getClass()的方式 23 Person person = new Person(); 24 Class clazz2 = person.getClass(); 25 26 // 3.Class类forName();获得(推荐) 27 Class clazz3 = Class.forName("com.imooc.reflect.test.Person"); 28 } 29 }
2 Constructor类
测试类
1 package com.imooc.reflect.test; 2 3 import java.lang.reflect.Constructor; 4 5 import org.junit.Test; 6 7 public class ConstructorTest { 8 9 @Test 10 /** 11 * 获得无参数的构造方法 12 */ 13 public void demo1() throws Exception{ 14 // 获得类的字节码文件对应的对象: 15 Class class1 = Class.forName("com.imooc.reflect.test.Person"); 16 Constructor c = class1.getConstructor(); 17 Person person = (Person) c.newInstance();// 相当于Person person = new Person(); 18 // person.eat(); 19 } 20 21 @Test 22 /** 23 * 获得有参数的构造方法 24 */ 25 public void demo2() throws Exception{ 26 Class class1 = Class.forName("com.imooc.reflect.test.Person"); 27 Constructor c = class1.getConstructor(String.class,String.class); 28 Person person = (Person) c.newInstance("张三","男");// Person person = new Person("张三","男"); 29 System.out.println(person); 30 } 31 }
3 Field 类
使用field,实体类没有get,set方法,也能使用.
测试类
1 package com.imooc.reflect.test; 2 3 import java.lang.reflect.Field; 4 5 import org.junit.Test; 6 7 public class FieldTest { 8 9 @Test 10 // 测试公有的属性 11 public void demo1() throws Exception{ 12 // 获得Class 13 Class class1 = Class.forName("com.imooc.reflect.test.Person"); 14 // 获得属性: 15 Field field = class1.getField("name"); 16 // 操作属性: p.name = ""; 17 Person p = (Person) class1.newInstance(); 18 field.set(p, "李四");// p.name = "李四"; 19 20 Object obj = field.get(p); 21 System.out.println(obj); 22 23 } 24 25 @Test 26 // 测试私有的属性 27 public void demo2() throws Exception{ 28 // 获得Class 29 Class class1 = Class.forName("com.imooc.reflect.test.Person"); 30 // 获得私有的属性 31 Field field = class1.getDeclaredField("sex"); 32 // 操作属性: 33 Person p = (Person) class1.newInstance(); 34 // 私有属性,需要设置一个可访问的权限: 35 field.setAccessible(true); 36 field.set(p, "男"); 37 // 获取值: 38 Object obj = field.get(p); 39 System.out.println(obj); 40 System.out.println(p); 41 } 42 }
4 Method类
测试类:
1 package com.imooc.reflect.test; 2 3 import java.lang.reflect.Method; 4 5 import org.junit.Test; 6 7 public class MethodTest { 8 9 @Test 10 // 测试公有的方法 11 public void demo1() throws Exception{ 12 Class class1 = Class.forName("com.imooc.reflect.test.Person"); 13 // 实例化: 14 Person person = (Person) class1.newInstance(); 15 // 获得公有的方法 16 Method method = class1.getMethod("eat"); 17 // 执行该方法: 18 method.invoke(person); // person.eat(); 19 } 20 21 @Test 22 // 测试私有的方法 23 public void demo2() throws Exception{ 24 Class class1 = Class.forName("com.imooc.reflect.test.Person"); 25 // 实例化: 26 Person person = (Person) class1.newInstance(); 27 // 获得方法: 28 Method method = class1.getDeclaredMethod("run"); 29 // 设置私有的属性的访问权限: 30 method.setAccessible(true); 31 // 执行该方法: 32 method.invoke(person, null); 33 } 34 35 @Test 36 // 测试私有的方法带参数 37 public void demo3() throws Exception{ 38 Class class1 = Class.forName("com.imooc.reflect.test.Person"); 39 // 实例化: 40 Person person = (Person) class1.newInstance(); 41 // 获得该方法: 42 Method method = class1.getDeclaredMethod("sayHello", String.class); 43 // 设置访问权限: 44 method.setAccessible(true); 45 // 执行: 46 Object obj = method.invoke(person, "Tom"); 47 System.out.println(obj); 48 } 49 }
原文地址:https://www.cnblogs.com/superjishere/p/12687533.html
- Spring Cloud(二)Consul 服务治理实现
- Spring Cloud(一)服务的注册与发现(Eureka)
- Shard 分片集群
- 面试官最爱的volatile关键字
- 玩转 WebView ,突破系统限制,让缓存更简单,更灵活
- Mycat 读写分离 数据库分库分表 中间件 安装部署,及简单使用
- 50道Java线程题
- Jrebel6.3.3破解,配置图文教程
- Spring Cloud(十一)高可用的分布式配置中心 Spring Cloud Bus 消息总线集成(RabbitMQ)
- Keras中带LSTM的多变量时间序列预测
- Spring Cloud(十)高可用的分布式配置中心 Spring Cloud Config 中使用 Refresh
- Hibernate 的性能优化的时候碰到了"抓取策略",有四种
- 基于 Spring Cloud 完整的微服务架构实战
- maven build时报错Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Flask-Login文档翻译
- jsp作业——简单的试卷和自动打分
- ESP8266烧入nodemcu简易教程
- 搭建简易的物联网服务端和客户端-STM32(一)
- 搭建简易的物联网服务端和客户端-Nodejs_net(二)
- 搭建简易的物联网服务端和客户端-Nodejs_mysql(三)
- 搭建简易的物联网服务端和客户端-net+mysql(四)
- 搭建简易的物联网服务端和客户端-Nodejs_express服务(六)
- TF中Placement的最后一道防线——Placer
- 搭建简易的物联网服务端和客户端-ECharts数据显示(七)
- 搭建简易的物联网服务端和客户端-整合(八)
- 搭建简易的物联网服务端和客户端-Maibu显示(九)
- 搭建简易的物联网服务端和客户端-DCloud手机端(十)
- 整理了一份 Docker系统知识,从安装到熟练操作看这篇就够
- 搭建简易的物联网服务端和客户端-第一次增补(十一)