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 ...
随机推荐
- 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)
首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...
- TODO:小程序开发过程之体验者
TODO:小程序开发过程之体验者 1. 小程序开发过程,先下载开发者并安装开发者工具,现在腾讯开放测试了,普通用户也可以登录开发者工具,如图普通用户登录为调试类型,但是只能建立无AppID的项目 如果 ...
- Android之常见问题集锦Ⅱ
Android问题集锦Ⅰ:http://www.cnblogs.com/AndroidJotting/p/4608025.html EditText输入内容改变事件监听 _edit.addTextCh ...
- SEED实验系列文章目录
美国雪城大学SEEDLabs实验列表 SEEDLabs是一套完整的信息安全实验,涵盖本科信息安全教学中的大部分基本原理.项目组2002年由杜文亮教授创建,目前开发了30个实验,几百所大学已采用.实验楼 ...
- django 第三天 有关库使用
项目中经常会用到第三方的lib和app,有些lib和app会进行不断更新,更新后可能会存在冲突,因此可以创建externals目录,下面欧app和libs.app存放django-cms,haysta ...
- 如何通过Git GUI将自己本地的项目上传至Github
最近在学习node.js和react,顺便复习了下AngluarJS相关的东西,写了些小demo想放在GitHub上,之前仅限于只申请了GitHub账号从没用过,今天花半天时间查资料认真学习Githu ...
- BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]
4453: cys就是要拿英魂! Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 90 Solved: 46[Submit][Status][Discu ...
- python-time 模块
1.时间戳是以秒为单位的浮点小数,时间戳以自1970年1月1日午夜到现在经过了的时间来表示 2.时间模块引入方式:import time 3.返回时间戳 time.time() 4.返回时间元组:ti ...
- ASP.NET 5 和Entity Framework 7公告仓库
ASP.NET 5 有一个公告仓库来介绍ASP.NET 5和 Entity Framework 7的主要变更说明,这个对于日夜更新的项目来说,很多人经常会遇到问题但是不知道去哪里寻找帮助,很多同学在做 ...
- 避免调试代码导致IE出错
记录一下 if(!window.console){ var names = ["log", "debug", "info", "w ...