(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中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...
随机推荐
- 2015第44周六tomcat集群了解
对于WEB应用集群的技术实现而言,最大的难点就是如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点,大体上有两种方式,一种是把所有Sessi ...
- HDU 5933 ArcSoft's Office Rearrangement 【模拟】(2016年中国大学生程序设计竞赛(杭州))
ArcSoft's Office Rearrangement Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- Unity3d 基于物理渲染Physically-Based Rendering之最终篇
前情提要: 讲求基本算法 Unity3d 基于物理渲染Physically-Based Rendering之specular BRDF plus篇 Unity3d 基于物理渲染Physically-B ...
- JavaScript高级程序设计21.pdf
第10章 DOM DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口) IE中所有DOM对象都是以COM对象的形式实现的,这意味着IE中的对象与原生JavaScript对象 ...
- JavaScript onConflict 处理
jQuery.noConflict用于释放jQuery和$两个全局变量. <!DOCTYPE html> <html> <head> <meta http-e ...
- JavaScript 类型判断 —— typeof 以及 instanceof 中的陷阱
JavaScript中基本类型包含Undefined.Null.Boolean.Number.String以及Object引用类型.基本类型可以通过typeof来进行检测,对象类型可以通过instan ...
- lightoj 1033 区间dp
题目链接:http://lightoj.com/volume_showproblem.php?problem=1033 #include <cstdio> #include <cst ...
- [置顶] Linux高编之进程--------fork函数的同步与异步(兄弟子进程和父子孙进程示列)
前面讲述的fork函数的基本用法,下面通过两个程序来说明fork函数同步与异步之间的关系: <1>通过fork函数实现在父进程下的四个兄弟子进程(即异步) : 函数实现代码: #inclu ...
- bzoj3907: 网格
http://www.cnblogs.com/Tunix/p/4354348.html #include<cstdio> #include<cstring> #include& ...
- Android摄像头抓取图像的格式
android.hardware.Camera.PreviewCallback /** * Callback interface used to deliver copies of preview f ...