反射: 当一个字节码文件加载到内存的时候,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的更多相关文章

  1. Java框架基础——反射(reflect)

    一.Class类的使用 1)在面向对象(oop)的世界里,万事万物皆对象. 在Java中,包括基本的数据类型,都是对象. Class c = int.class;//int 的类类型 那就是说: 类是 ...

  2. JAVA编程之——反射Reflect

    说到反射,首先要说一下Java中的类和对象. 在Java中万事万物皆对象(有两个 例外,一个是普通数据类型,另一个是静态的东西,静态的东西不是对象的,是属于类的). 在Java中,类也是对象,类是ja ...

  3. Java中的反射--Reflect

    在张孝祥老师的Java讲解中,学习到了Java反射的一部分知识,觉得有必要好好学习一下哈. 一.反射的理解 经典总结:反射就是把Java类中的各种成分映射成为相应的Java类 例如:一个Java类中用 ...

  4. java 从零开始手写 RPC (05) reflect 反射实现通用调用之服务端

    通用调用 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RPC (02)-netty4 实现客户端和服务端 java 从零开始手写 RPC (03) 如何 ...

  5. java 反射(reflect)总结,附对象打印工具类

    java反射机制认知 java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类的信息以及动态调用对象的方法的 ...

  6. Java基础——反射 reflect

    什么是反射 (1)Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称 ...

  7. Java从零开始学四十(反射简述一)

    一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...

  8. Java反射Reflect的使用详解

    目录 一. 什么是反射 二. 反射的基础Class 2.1 Class类概述 2.2 Class类对象获取的三种方式 三. 反射-构造函数 3.1 getDeclaredConstructor(Cla ...

  9. Java中的反射和注解

    前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...

随机推荐

  1. 【HDOJ】1811 Rank of Tetris

    并查集+拓扑排序.使用并查集解决a = b的情况. #include <iostream> #include <cstdio> #include <cstring> ...

  2. 微软开放技术发布开源的微软云服务器底盘管理器 (Chasis Manager) 软件

     发布于 2014-07-14 作者 陈 忠岳 今天,微软公司加入开放计算项目(OCP),贡献出硬件和软件规范,管理 API 和协议,机械 CAD 模型,以及电路板文件和 Gerbers(描述印刷 ...

  3. 【转】android: 长按删除listview的item

    原文网址:http://www.cnblogs.com/nuistlr/archive/2012/09/07/2675649.html 首先要继承OnItemLongClickListener pub ...

  4. Eclipse下安装及配置maven项目管理工具

    ①eclipse下maven插件安装. 本地maven安装.环境变量配置完成后,打开eclipse,点击eclipse菜单栏Help->Eclipse Marketplace搜索关键字maven ...

  5. sshd_config 配置文件

    Ssh-server 服务端 sshd_concfig Port Protocol HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_hos ...

  6. Top 10 Java Debugging Tips with Eclipse

    In this tutorial we will see about debugging java applications using Eclipse. Debugging helps us to ...

  7. pecl/mongo is already installed

    sw-engine-cgi PHP MongoDB database drivermongodb database driver,数据库驱动;

  8. Best Premium Private Proxy Service | Lime Proxies

    Best Premium Private Proxy Service | Lime Proxies undefined

  9. 【PNG格式中文详解】

        技术文档(Document)   PNG格式 PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是企图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性.流式网 ...

  10. Cookie及App登陆的原理

    1.Cookie Cookie意为"甜饼",是由W3C组织提出的.目前Cookie已经成为标准.由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份.怎么办呢?就给 ...