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 ...
随机推荐
- NodeJs之log4js
log4js log4js是一个管理,记录日志的工具. 其实与morgan的作用类似. 安装 npm install -g log4js log4js的6个日志级别 分别是:trace(蓝色).deb ...
- 在 ML2 中配置 OVS flat network - 每天5分钟玩转 OpenStack(133)
前面讨论了 OVS local network,今天开始学习 flat network. flat network 是不带 tag 的网络,宿主机的物理网卡通过网桥与 flat network 连接, ...
- category中重写方法?
问:可以在category中重写方法吗? 答:代码上可以实现 在category中重写方法,但在实际开发中,不建议这样做.如果确实需要重写原有方法也建议使用子类进行重写. category是为了更方便 ...
- 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付
微信支付教程系列之扫码支付 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...
- 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...
- Oracle碎碎念~1
1. 设置SQL*Plus提示符 SQL> set sqlprompt "_user'@'_connect_identifier>" SYS@orcl> 为了对所 ...
- ASP.NET加密和解密数据库连接字符串
大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作.当有人想要获取你程序中的数据库信息,他首先看到的可能会是We ...
- JavaScript学习笔记(四)——jQuery插件开发与发布
jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...
- Android之数据存储的五种方法
1.Android数据存储的五种方法 (1)SharedPreferences数据存储 详情介绍:http://www.cnblogs.com/zhangmiao14/p/6201900.html 优 ...
- python性能检测工具整理
python 运行后出现core dump产生core.**文件,可通过gdb来调试 Using GDB with a core dump having found build/python/core ...