(java)从零开始之-反射Reflect
反射: 当一个字节码文件加载到内存的时候,jvm会对该字节码进行解剖,然后会创建一个对象的Class对象,把字节码文件的信息全部都存储到该Class对象中,我们只要获取到Class对象,我们就可以使用字节码对象设置对象的属性或者调用对象的方法等操作
这里记录下反射的简单使用,方便查阅
/*******************
获取class
*******************/
//Class clazz = Person.class;//方式一,通过类名获取
//Class clazz = new Person().getClass();//方式二,通过对象获取
Class clazz = Class.forName("reflect.Person");//方式三,通过完成限定名获取。参数为(包名+类名)。推荐使用,也是最常用 /*******************
获取某class的构造方法
******************/
//Constructor[] constructor = clazz.getConstructors();//获取所有共有构造方法
//Constructor[] constructor = clazz.getDeclaredConstructors();//获取所有构造方法
//Constructor constructor = clazz.getConstructor(String.class,String.class);//获取某一个构造方法(不包括私有构造方法),参数为null表示获取无参构造方法
Constructor constructor = clazz.getDeclaredConstructor(String.class,String.class);//获取某一个构造方法(包括私有构造方法),参数为null表示获取无参构造方法
/*******************
执行构造方法
******************/
constructor.setAccessible(true);//如果构造方法为私有,则需改变访问修饰权限
Person p =(Person) constructor.newInstance("100","jiuxiangfeng1");//参数为null表示执行无参构造方法 /*******************
获取方法
******************/
//Method[] method = clazz.getMethods();//获取所有共有方法
//Method[] method = clazz.getDeclaredMethods();//获取所有方法
//Method method = clazz.getMethod("setName",String.class);//获取某个方法(不包括私有方法),第二个为可变参数,如果第二个参数为null表示该方法没有参数
Method method = clazz.getMethod("setName",String.class);//获取某个方法(包括私有方法),第二个为可变参数,如果第二个参数为null表示该方法没有参数
/*******************
执行方法
******************/
//method.setAccessible(true);//如果方法为私有,执行前需改变访问修饰权限,否则会引发异常
method.invoke(p, "jiuxiangfeng2");//第一个参数为方法执行的对象,如果是静态方法,第一个参数应为null,第二个参数为可变参数,如果第二个参数为null表示该方法没有参数 /*******************
获取成员变量
******************/
//Field[] field = clazz.getFields();//获取所有公共成员变量
//Field[] field = clazz.getDeclaredFields();//获取所有成员变量
//Field field = clazz.getField("name");//获取单个公共成员变量。参数为成员变量名
Field field = clazz.getDeclaredField("name");//获取单个成员变量。参数为成员变量名
/*******************
设置成员变量的值
******************/
field.setAccessible(true);//如果为私有成员变量,那么应该改变其访问修饰权限为可以访问,否则引发异常
field.set(p, "jiuxiangfeng3");//设置某个对象成员变量的值. 参数1为哪个对象,参数2为其成员变量的值
System.out.println(p);
以上代码执行都假设有一个Person.class
package reflect;
public class Person {
public String id;
public String name; public Person(String id, String name) {
super();
this.id = id;
this.name = name;
}
public Person() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return this.id+"="+this.name;
}
}
(java)从零开始之-反射Reflect的更多相关文章
- Java框架基础——反射(reflect)
一.Class类的使用 1)在面向对象(oop)的世界里,万事万物皆对象. 在Java中,包括基本的数据类型,都是对象. Class c = int.class;//int 的类类型 那就是说: 类是 ...
- JAVA编程之——反射Reflect
说到反射,首先要说一下Java中的类和对象. 在Java中万事万物皆对象(有两个 例外,一个是普通数据类型,另一个是静态的东西,静态的东西不是对象的,是属于类的). 在Java中,类也是对象,类是ja ...
- Java中的反射--Reflect
在张孝祥老师的Java讲解中,学习到了Java反射的一部分知识,觉得有必要好好学习一下哈. 一.反射的理解 经典总结:反射就是把Java类中的各种成分映射成为相应的Java类 例如:一个Java类中用 ...
- java 从零开始手写 RPC (05) reflect 反射实现通用调用之服务端
通用调用 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RPC (02)-netty4 实现客户端和服务端 java 从零开始手写 RPC (03) 如何 ...
- java 反射(reflect)总结,附对象打印工具类
java反射机制认知 java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类的信息以及动态调用对象的方法的 ...
- Java基础——反射 reflect
什么是反射 (1)Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称 ...
- Java从零开始学四十(反射简述一)
一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...
- Java反射Reflect的使用详解
目录 一. 什么是反射 二. 反射的基础Class 2.1 Class类概述 2.2 Class类对象获取的三种方式 三. 反射-构造函数 3.1 getDeclaredConstructor(Cla ...
- Java中的反射和注解
前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...
随机推荐
- 深入浅出Node.js (附录B) - 调试Node
B.1 Debugger B.2 Node Inspector B.2.1 安装Node Inspector B.2.2 错误堆栈
- JAVA中IO技术:BIO、NIO、AIO
1.同步异步.阻塞非阻塞概念 同步和异步是针对应用程序和内核的交互而言的. 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作 ...
- POJ --2104
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 34935 Accepted: 11134 Ca ...
- HDOJ 1716 排列2 next_permutation函数
Problem Description Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数. Input 每组数据占一行,代表四张卡 ...
- openstack grizzly版network网络节点安装
版本以及源的配置和控制节点一致 1.安装完操作系统已经apt源配置完成之后,一定要执行 apt-get update root@cloud:~# mv /etc/apt/sources.list /e ...
- Ubuntu14.04 安装配置Hadoop2.6.0
目前关于Hadoop的安装配置教程书上.官方教程.博客都有很多,但由于对Linux环境的不熟悉以及各种教程或多或少有这样那样的坑,很容易导致折腾许久都安装不成功(本人就是受害人之一).经过几天不断尝试 ...
- ural 1333 化平面为点计算覆盖率
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1333 #include<cstdio> #include<cstrin ...
- Nodejs负载均衡:haproxy,slb以及node-slb - i5ting的个人空间 - 开源中国社区
Nodejs负载均衡:haproxy,slb以及node-slb - i5ting的个人空间 - 开源中国社区 undefined
- Wall - POJ 1113(求凸包)
题目大意:给N个点,然后要修建一个围墙把所有的点都包裹起来,但是要求围墙距离所有的点的最小距离是L,求出来围墙的长度. 分析:如果没有最小距离这个条件那么很容易看出来是一个凸包,然后在加上一个最小距离 ...
- 跨服务器备注SQL数据库 分类: SQL Server 2015-03-05 08:52 227人阅读 评论(0) 收藏
任务:把服务器1上的SQL数据库自动备份到服务器2上,命名格式=数据库名+年月日+小时. 说明: 服务器2=>192.168.0.22 数据库名=>Book 共享文件夹路径:192.168 ...