java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(2)
当我们知道一个类的对象,或者知道一个类的路径,或者指导这个类的名称的时候我们可以获取到这个类的类对象
当我们仅仅知道一个类的类对象的时候我们依然无法操作这个类,因为我们不知道这个类的属性,类的方法.那么我们如何从类对象中获取到他所拥有的属性和方法呢?
我们利用Class类的几个属性和方法:
摘自java API:
在上一篇的基础上创建一个新的类RefTest:
RefTest.java文件package com.cx.main;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import com.cx.bean.Book;
public class RefTest {
//获取类对象的属性getDeclaredFields()
public void getClassFiled(Object o){
Class c=o.getClass();
Field[] fs=c.getDeclaredFields();//获取c类中的所有方法《包括私有方法》/**
* 在这里需要注意一个方法getFields()与getDeclaredFields()都是获取所有属性,但是前者只能获取public属性
*/
for (Field f : fs) {
//获取属性值的时候属性是私有的,不能调用get方法那么就必须获取到操作权限否则就会报错
f.setAccessible(true);//启用访问
System.out.println(Modifier.toString(f.getModifiers())+"--"+f.getType()+"--"+f.getName()+"--"+f.get(o));//打印出属性修饰符,类型和属性名
}
}
//获取类对象的方法getDeclaredMethods()
public void getClassMethod(Object o){
Class c=o.getClass();
Method[] mt=c.getDeclaredMethods();//获取c类中所有的方法
for (Method m : mt) {
System.out.println(Modifier.toString(m.getModifiers())+"--"+m.getReturnType()+"--"+m.getName());
} }
//获取方法并且调用它 invoke() 函数
public void useMethod(Object o){
Class c=o.getClass();
try {
//获取getName()方法并调用它
Method m=c.getMethod("getName",null);
m.invoke(o, new Object[0]); //获取setName方法并且调用它
Method m2=c.getMethod("setName",String.class);//一个参数方法名,一个参数为参数类型
m2.invoke(o, "java编程思想");//o这个对象调用了m2这个方法传递参数为“java编程思想”==o.setName("java编程思想") } catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Book bo=new Book();
bo.setId(123);
bo.setName("java核心技术");
bo.setType("技术"); //获取所有的属性和方法
RefTest rs=new RefTest();
System.out.println("属性:权限修饰符--属性类型--属性名--属性值--");
rs.getClassFiled(bo);
System.out.println("方法:权限修饰符--返回值类型--方法名----");
rs.getClassMethod(bo);
//获取指定方法并且调用它
rs.useMethod(bo);
} }
这段代码展示了如何从传递的一个对象获取到他所属类的所有属性和和方法。
这里也就基本展示了反射的本质:
反射机制:Reflect,指的是程序在运行时能够获取到任何类的内部所有信息<属性,方法>
反射的功能:只要给出类的全名就可以通过反射获取到类的所有信息
还可以获取到任何一个类的类对象
可以获取所有属性对象,并操作它(包括私有属性)
可以获取到类中,父类中的所有方法并调用
《《《《《此时反射的这个功能:操作私有属性,从java的特性上来说破坏了java的封装性,
《《《《《但是私有属性是不是能随意操作的,在操作之前我们需要获取到操作权限
f.setAccessible(true);//启用f属性的访问
这个获取权限并不能修改原有属性的权限,只是暂时的获取到可以操作的权限。
java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(2)的更多相关文章
- Java进阶之reflection(反射机制)——反射概念与基础
反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...
- Java进阶专题(二十六) 将近2万字的Dubbo原理解析,彻底搞懂dubbo
前言 前面我们研究了RPC的原理,市面上有很多基于RPC思想实现的框架,比如有Dubbo.今天就从Dubbo的SPI机制.服务注册与发现源码及网络通信过程去深入剖析下Dubbo. Dubbo架构 ...
- Java进阶05 多线程
链接地址:http://www.cnblogs.com/vamei/archive/2013/04/15/3000898.html 作者:Vamei 出处:http://www.cnblogs.com ...
- Java进阶之多线程
多线程 多线程(multiple thread)是计算机实现多任务并行处理的一种方式. 在单线程情况下,计算机中存在一个控制权,并按照顺序依次执行指令.单线程好像是一个只有一个队长指挥的小队,整个小队 ...
- JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践
JAVA进阶之旅(二)--认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践 我们继续聊JAVA,这次比较有意思,那就是反射了 一.认识 ...
- java反射机制(基础版)
package com.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import ja ...
- Java进阶(六)Java反射机制可恶问题NoSuchFieldException
作为一种重要特性,Java反射机制在很多地方会用到.在此做一小结,供朋友们参考. 首先从一个问题开始着手. 可恶的问题又来了,NoSuchFieldException,如下图所示: 完全不知道这个qu ...
- Java进阶知识点8:高可扩展架构的利器 - 动态模块加载核心技术(ClassLoader、反射、依赖隔离)
一.背景 功能模块化是实现系统能力高可扩展性的常见思路.而模块化又可分为静态模块化和动态模块化两类: 1. 静态模块化:指在编译期可以通过引入新的模块扩展系统能力.比如:通过maven/gradle引 ...
- java Reflection(反射)基础知识讲解
原文链接:小ben马的java Reflection(反射)基础知识讲解 1.获取Class对象的方式 1.1)使用 "Class#forName" public static C ...
随机推荐
- 你知道C#中的Lambda表达式的演化过程吗?
那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...
- 用CIL写程序:你好,沃尔德
前言: 项目紧赶慢赶总算在年前有了一些成绩,所以沉寂了几周之后,小匹夫也终于有时间写点东西了.以前匹夫写过一篇文章,对CIL做了一个简单地介绍,不过不知道各位看官看的是否过瘾,至少小匹夫觉得很不过瘾. ...
- 路由的Resolve机制(需要了解promise)
angular的resovle机制,实际上是应用了promise,在进入特定的路由之前给我们一个做预处理的机会 1.在进入这个路由之前先懒加载对应的 .js $stateProvider .state ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(70)-微信公众平台开发-成为开发者
系列目录 前言: 一.阅读这段系列之前,你必须花半天时间大致阅读微信公众平台的API文档,我尽量以简短快速的语言与大家分享一个过程 二.借助微信公众平台SDK Senparc.Weixin for C ...
- 在开启DRS的集群中修复VMware虚拟主机启动问题
通过iSCSI方式连接到ESXi主机上的外挂存储意外失联了一段时间,导致部分虚拟主机在集群中呈现出孤立的状态,单独登陆到每台ESXi上可以看到这些虚拟主机都变成了unknow状态.因为有过上一次(VM ...
- Oracle手边常用70则脚本知识汇总
Oracle手边常用70则脚本知识汇总 作者:白宁超 时间:2016年3月4日13:58:36 摘要: 日常使用oracle数据库过程中,常用脚本命令莫不是用户和密码.表空间.多表联合.执行语句等常规 ...
- C# 生成验证码图片时消除锯齿
引言 基于生成图片实现了一个手机号转图片的需求. 内容也很简单,直接用手机号生成一个png图片.就是为了背景透明以便其他地方调用. 有无锯齿主要依靠一句代码:g.TextRenderingHint= ...
- 多线程条件通行工具——CountDownLatch
CountDownLatch的作用是,线程进入等待后,需要计数器达到0才能通行. CountDownLatch(int)构造方法,指定初始计数. await()等待计数减至0. await(long, ...
- Spring配置文件标签报错:The prefix "XXX" for element "XXX:XXX" is not bound. .
例如:The prefix "context" for element "context:annotation-config" is not bound. 这种 ...
- 敏捷转型历程 - Sprint3 一团糟的演示会
我: Tech Leader 团队:团队成员分布在两个城市,我所在的城市包括我有4个成员,另外一个城市包括SM有7个成员.另外由于我们的BA离职了,我暂代IT 的PO 职位.PM和我在一个城市,但他不 ...