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 ...
随机推荐
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- UWP 律师查询 MVVM
APP简介 律师查询是基于聚合数据的律师查询接口做的,这个接口目前处于停用状态,但是,由于我是之前申请的,所以,还可以用,应该是无法再申请了. 效果图 开发 一.HttpHelper 既然是请求接口的 ...
- jQuery之ajax实现篇
jQuery的ajax方法非常好用,这么好的东西,你想拥有一个属于自己的ajax么?接下来,我们来自己做一个简单的ajax吧. 实现功能 由于jq中的ajax方法是用了内置的deferred模块,是P ...
- C# 发送邮件 附件名称为空
示例代码: // 1.创建邮件 MailMessage mailMsg = new MailMessage(); mailMsg.To.Add(new MailAddress("test@ ...
- React在开发中的常用结构以及功能详解
一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...
- 利用Oracle RUEI+EM12c进行应用的“端到端”性能诊断
概述 我们知道,影响一个B/S应用性能的因素,粗略地说,有以下几个大的环节: 1. 客户端环节 2. 网络环节(可能包括WAN和LAN) 3. 应用及中间层环节 4. 数据库层环节 能够对各个环节的问 ...
- 流程开发Activiti 与SpringMVC整合实例
流程(Activiti) 流程是完成一系列有序动作的概述.每一个节点动作的结果将对后面的具体操作步骤产生影响.信息化系统中流程的功能完全等同于纸上办公的层级审批,尤其在oa系统中各类电子流提现较为明显 ...
- addTwoNumbers
大神的代码好短,自己写的120多行=_= 各种判断 ListNode *f(ListNode *l1, ListNode *l2) { ListNode *p1 = l1; ListNode *p2 ...
- 设计模式C#合集--工厂方法模式
简单工厂,代码: public interface ISpeak { public void Say(); } public class Hello : ISpeak { public void Sa ...
- RMS:不能对生产服务器使用测试清单
问题说明:在使用office软件RMS加密时报:不能对生产服务器使用测试清单,或者使用 rmsbulk.exe进行RMS加密时,报不能连接到RMS服务器. 解决办法: 请到https://suppor ...