当前位置: 首页 > news >正文

java的反射

 
  
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
 
  

  


1
package com.www.invoke; 2 3 import java.lang.reflect.Method; 4 5 /** 6 * 通过反射操作 类的方法 7 * java的反射 是说的是运行时 。 8 * 反射的总结: 9 * 1,每个类都有与之对用的Class对象。 10 * 2,每个方法都有与之对用的Method对象。 11 * 3,每个成员变量都有与之对用的Field对象。 12 * 4,第一步都是获得类对应的Class对象。 13 * 5,通过反射可以获得私有的成员变量和方法。 14 * @author Kelly.chen 15 * 16 */ 17 public class InvokeTest { 18 19 public int add(int a, int b){ 20 return a + b; 21 } 22 23 public String getName(String name){ 24 return "My name is "+name; 25 } 26 27 public static void main(String[] args) throws Exception { 28 //获得类对应的的Class对象 方法一 29 //Class<?> classType = InvokeTest.class; 30 //获得类对应的Class对象 方法二 31 Class<?> classType = Class.forName("com.www.invoke.InvokeTest"); 32 //获得InvokeTest 的一个对象 相当于 InvokeTest invokeTest = new InvokeTest(); 33 Object invokeTest = classType.newInstance(); 34 //测试是不是 InvokeTest的对象 结果是 ture 35 System.out.println(invokeTest instanceof InvokeTest); 36 37 //获得 add() 方法 38 //第一个参数是方法的名字,第二个参数是Class类型的可变参数,与方法的参数对应 39 Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class}); 40 41 System.out.println(addMethod.getName()); 42 //调用方法 43 //第一个参数是那个对象的方法,第二个参数是Object类型的可变参数,与方法参数对应 44 Object object = addMethod.invoke(invokeTest, new Object[]{2, 3}); 45 46 System.out.println(object); 47 48 //获得getName()方法 49 Method getNameMethod = classType.getMethod("getName", new Class[]{String.class}); 50 //调用getName()方法 51 Object objectName = getNameMethod.invoke(invokeTest, new Object[]{"chenlei"}); 52 System.out.println(objectName); 53 //得到所有public 方法(包括继承父类的方法) 54 Method[] methods = classType.getMethods(); 55 for (Method method : methods) { 56 System.out.println(method.getName());//获得方法的名字 57 } 58 } 59 }

 获得私有方法和成员变量

 1 package com.www.invoke;
 2 
 3 import java.lang.reflect.Field;
 4 import java.lang.reflect.Method;
 5 
 6 public class PrivateTest {
 7     
 8     private String address="shanghai";
 9     
10     public int age = 20;
11     
12     protected String school = "北京大学";
13     
14     private String sayHello(String name){
15         
16         return "Hello :"+name;
17     }
18     public static void main(String[] args) throws Exception {
19 
20         Class<?> classType = PrivateTest.class;
21         PrivateTest privateTest = (PrivateTest) classType.newInstance();
22         //可以获得私有的方法,第一个参数是方法的名字,第二个参数是Class类型的可变参数,与方法的参数类型对应
23         Method method = classType.getDeclaredMethod("sayHello", new Class[] { String.class });
24         //true不再进行访问权限检查,之后就可以访问此私有方法了,false与之相反
25         method.setAccessible(true); 
26         //调用方法
27         Object object = method.invoke(privateTest, new Object[] { "chenlei" });
28         System.out.println(object);
29         /* -----------------------------调用 成员变量-----------------------*/
30         //只能获得public 修饰的方法的成员变量
31         Field ageField = classType.getField("age"); 
32         //获得变量的值
33         int age = ageField.getInt(privateTest);
34         System.out.println(age);
35         Field addressField = classType.getDeclaredField("address");
36         //true不再进行访问权限检查,之后就可以访问此私有变量了
37         addressField.setAccessible(true);
38         //获得变量的值
39         String address = (String) addressField.get(privateTest);
40         System.out.println(address);
41         //获得所有public修饰的成员变量
42         Field[] fields = classType.getFields();
43         for (Field field : fields) {
44             System.out.println(field);
45         }
46     }
47 }

总结:

java的反射 是说的是运行时 。
反射的总结:
1,每个类都有与之对用的Class对象。
2,每个方法都有与之对用的Method对象。
3,每个成员变量都有与之对用的Field对象。
4,第一步都是获得类对应的Class对象。
5,通过反射可以获得私有的成员变量和方法。

  

转载于:https://www.cnblogs.com/c9999/p/6068459.html

相关文章:

  • Spring+AOP+Log4j 用注解的方式记录指定某个方法的日志
  • 使用Apache的Base64类实现Base64加解密
  • 【ARM-Linux开发】在win下开发的eclipse+yougatoo+jlink环境搭建
  • Python 绘图利器 —— ggplot
  • Linux下多网卡同网段多IP网络分流设定方法
  • 跟庄
  • SQL连接查询
  • 算法导论笔记之红黑树
  • Hibernate 系列教程10-组成关系
  • Java丨JDK与JRE
  • JDBC基础
  • 要不搞个blog公告?
  • 2016.11.19
  • 手机常用meta标签-有注释
  • Spring Boot 系列教程2-Data JPA
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • CentOS从零开始部署Nodejs项目
  • ES6 学习笔记(一)let,const和解构赋值
  • markdown编辑器简评
  • Redis的resp协议
  • 测试如何在敏捷团队中工作?
  • 解析带emoji和链接的聊天系统消息
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 深度学习在携程攻略社区的应用
  • 使用parted解决大于2T的磁盘分区
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • $.ajax中的eval及dataType
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (30)数组元素和与数字和的绝对差
  • (day6) 319. 灯泡开关
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (笔试题)合法字符串
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)EOS中账户、钱包和密钥的关系
  • (转)jdk与jre的区别
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET delegate 委托 、 Event 事件
  • .net mvc部分视图
  • .NET 的程序集加载上下文
  • .NET 使用配置文件
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • /boot 内存空间不够
  • @AliasFor注解
  • [AIGC] Redis基础命令集详细介绍
  • [Android Pro] AndroidX重构和映射
  • [ARM]ldr 和 adr 伪指令的区别
  • [BZOJ3757] 苹果树
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [C]整形提升(转载)
  • [CF482B]Interesting Array