Java reflect 反射 2
- Constructor
Constructor表示一个类的构造器。即构造器的反射对象!
它是Class的一个组成部门,所以需要先得到Class,再通过Class的方法得到Constructor
1获取Constructor对象
获取Construcator对象需要使用Class对象,下面API来自Class类:
l Constructor getConstructor(Class<?>… parameterTypes):通过指定的参数类型获取公有构造器反射对象;
l Constructor[] getConstructors():获取所有公有构造器对象;
l Constructor getDeclaredConstructor(Class… parameterTypes):通过指定参数类型获取构造器反射对象。可以是私有构造器对象;
l Constructor[] getDeclaredConstructors():获取所有构造器对象。包含私有构造器;
2 Construcator类常用方法
l String getName():获取构造器名;
l Class getDeclaringClass():获取构造器所属的类型;
l Class[] getParameterTypes():获取构造器的所有参数的类型;
l Class[] getExceptionTypes():获取构造器上声明的所有异常类型;
l T newInstance(Object… initargs):通过构造器反射对象调用构造器。
3 练习:通过Construcator创建对象
public class Demo1 {
@Test
public void fun1() throws Exception {
String className = "cn.itcast.User";
Class clazz = Class.forName(className);
//通过参数类型来获取构造器,即获取两个String类型参数的构造器反射对象。
Constructor c = clazz.getConstructor(String.class, String.class);
//通过构造器反射对象来调用构造器,并传递参数给构造器
User user = (User)c.newInstance("zhangSan", "123");
System.out.println(user);
}
}
public class User {
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
Method 表示成员方法的类
1获取Method
获取Method需要通过Class对象,下面是Class类的API:
l Method getMethod(String name, Class… parameterTypes):本类 父类 公共方法 通过方法名和方法参数类型获取方法反射对象
包含父类中声明的公有方法,但不包含所有私有方法;
l Method[] getMethods():本类 父类 所有公共方法 获取所有公有方法,包含父类中的公有方法,但不包含任何私有方法;
l Method getDeclaredMethod(String name, Class… parameterTypes):本类所有方法 通过方法名和方法参数类型获取本类中声明的方法的反射对象
包含本类中的私有方法,但不包含父类中的任何方法;
l Method[] getDeclaredMethods():本类所有方法 获取本类中所有方法,包含本类中的私有方法,但不包含父类中的任何方法。
2 Method常用方法
l String getName():获取方法名;
l Class getDeclaringClass():获取方法所属的类型;
l Class[] getParameterTypes():获取方法的所有参数的类型;
l Class[] getExceptionTypes():获取方法上声明的所有异常类型;
l Class getReturnType():获取方法的返回值类型;
l Object invoke(Object obj, Object… args):通过方法反射对象调用方法
如果当前方法是实例方法,那么当前对象就是obj,
如果当前方法是static方法,那么可以给obj传递null。args表示是方法的参数;
3 练习:通过Method调用方法
public class Demo1 {
@Test
public void fun1() throws Exception {
String className = "cn.jt.User";
Class clazz = Class.forName(className);
Constructor c = clazz.getConstructor(String.class, String.class);
User user = (User)c.newInstance("zhangSan", "123");
//获取名为toString,没有参数的方法
Method method = clazz.getMethod("toString");
//反射调用这个方法,给this赋值为user,没有传递参数,因为这个方法没有参数
String result = (String)method.invoke(user);
//打印返回值
System.out.println(result);
}
}
Ø Field
Field表示类的成员变量,可以是实例变量,也可以是静态变量。
1 获取Field对象
获取Field对象需要使用Class对象,下面是Class类的API:
l Field getField(String name):通过名字获取公有成员变量的反射对象,包含父类中声明的公有成员变量;
l Field[] getFields():获取所有公有成员变量反射对象,包含父类中声明的公有成员变量;
l Field getDeclaredField(String name):通过名字获取本类中某个成员变量,包含本类的private成员变量,但父类中声明的任何成员变量都不包含;
l Field[] getDeclaredFields():获取本类中声明的所有成员变量,包含private成员变量,但不包含父类中声明的任何成员变量;
2 Field类的常用方法
l String getName():获取成员变量名;
l Class getDeclaringClass():获取成员变量所属的类的类型;
l Class getType():获取当前成员变量的类型;
l Object get(Object obj):获取obj对象的成员变量的值;
l void set(Object obj, Object value):设置obj对象的成员变量值为value;
3 练习:通过Field读写成员
public class Demo1 {
@Test
public void fun1() throws Exception {
String className = "cn.jt.User";
Class clazz = Class.forName(className);
User user = new User("zhangSan", "123");
//获取名为username的成员变量
Field field1 = clazz.getField("username");
//获取名为password的成员变量
Field field2 = clazz.getField("password");
//获取user对象的username成员变量值,因为field1表示的就是username成员变量
String username = (String)field1.get(user);
//获取user对象的password成员变量值,因为field2表示的就是password成员变量
String password = (String)field2.get(user);
System.out.println(username + ", " + password);
//设置user对象的username成员变量值为liSi
field1.set(user, "liSi");
//设置user对象的password成员变量值为456
field2.set(user, "456");
System.out.println(user);
}
}
Ø AccessibleObject
AccessibleObject类是Constructor、Method、Field三个类的父类。
AccessibleObject最为重要的方法如下:
l boolean isAccessible():判断当前成员是否可访问;
l void setAccessible(boolean flag):设置当前成员是否可访问。
当设置该参数为true时,那么private的成员、方法、构造器就都可以操作了。
当Constructor、Method、Field为私有时,如果我们想反射操作,那么就必须先调用反射对象的setAccessible(true)方法,然后才能操作。
User.java
public class User {
private String username;
private String password; public User() {
} public User(String username, String password) {
this.username = username;
this.password = password;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} @Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
} 注意,User类的username和password成员变量为private的,
这时再通过Field来反射操作这两个成员变量就必须先通过setAccessible(true)设置后才行。 public class Demo1 {
@Test
public void fun1() throws Exception {
String className = "cn.jt.User";
Class clazz = Class.forName(className);
User user = new User("zhangSan", "123"); 因为username和password都是私有的成员变量,所以需要使用getDeclaredField()才能获取到。 Field field1 = clazz.getDeclaredField("username");
Field field2 = clazz.getDeclaredField("password"); 设置成员变量是可以访问的,对于私有变量、方法、构造器都必须先调用这个方法后才能操作,不然会抛出异常 field1.setAccessible(true);
field2.setAccessible(true); String username = (String)field1.get(user);
String password = (String)field2.get(user); System.out.println(username + ", " + password); field1.set(user, "liSi");
field2.set(user, "456"); System.out.println(user);
}
}
Summary:
Class 类的反射对象
Constructor 构造器的反射对象
Method表示方法的反射对象
Field 成员的反射对象

Java reflect 反射 2的更多相关文章
- Java —— Reflect反射机制
JAVA反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制. ...
- java reflect反射调用方法invoke
类定义 package Reflect; public class MyTest { public int a; public static int b; public static final in ...
- Java reflect 反射学习笔记
1. class 类的使用 万事万物皆对象 (基本数据类型, 静态成员不是面向对象), 所以我们创建的每一个类都是对象, 即类本身是java.lang.Class类的实例对象, 但是这些对象不需要 n ...
- java reflect反射---Java高级开发必须懂的
理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助. 一.Class类的使用 1.万事万物皆对象,( ...
- java reflect反射获取方法变量参数
类的成员包含变量(Field),方法(Method),构造器(Constructor) 类定义 package Reflect; public class MyTest { public int a; ...
- Java reflect 反射 1
1 反射的概述 反射含义:可以获取正在运行的Java对象. JAVA反射机制是在运行状态中,对于任意一个类,都能够得到这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法; 这种动态 ...
- Java reflect 反射 3 Class.forname
Class.forName("xxx.xx.xx") 1 作用:加载类文件Class.forName(xxx.xx.xx) 返回的是一个类 而非对象 作用就是把对象的模板加载到内存 ...
- Java reflect 反射 0 java对象的三个阶段
- Java反射学习(java reflect)(二)
ok之前说了Java的反射和反射分析类,那这些东西有神马作用呢,下面就来说应用: 三.运行时使用反射分析对象 简单写一个Employee类,然后利用JAVA反射去取name域,getDeclareFi ...
随机推荐
- .Net工程师面试笔试宝典
.Net工程师面试笔试宝典 传智播客.Net培训班内部资料 http://net.itcast.cn 这套面试笔试宝典是传智播客在多年的教学和学生就业指导过程中积累下来的宝贵资料,大部分来自于学员从面 ...
- CSS Animation triggers text rendering change in Safari
薄荷新首页上周五内测,花哥反馈在 MacBook Safari 浏览器下 鼠标移动到第一个商品的时候后面几个商品的文字会加粗.这是什么鬼??? 待我回到家打开笔记本,鼠标蹭蹭蹭的发现问题远不止如此: ...
- backbone.js 学习笔记
Backbone.Model 模型.相当于表定义,定义一个表当中有的列 defaults:设置属性的默认值 initialize():初始化函数 get(key):获取属性值 set(data):设置 ...
- Js 事件详解
1.事件流 1.1 事件流 描述的是在页面中接受事件的顺序 1.2 事件冒泡 由最具体的元素接收,然后逐级向上传播最不具体的元素的节点(文档) 1.3 事件捕获 最不具体的节点先接收事件,而最具体的节 ...
- OpenStack 业务链networking-sfc介绍 (1) - 概述
原文链接:https://blog.csdn.net/bc_vnetwork/article/details/65630355 1. Service Function Chain概述 Neutron ...
- Django-DRF-视图的演变
版本一(基于类视图APIView类) views.py: APIView是继承的Django View视图的. from .serializers import UserSerializers #导入 ...
- 【bzoj 2716】[Violet 3]天使玩偶 (CDQ+树状数组)
题目描述 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 Ayu 生活的 ...
- WiFi安全那些事儿,整理推荐~
即使你安装了防火墙,不连接任何WIFI和热点,不在任何不受信任的网站下载东西,及时清理缓存和个人敏感信息,你相信吗?你的个人隐私仍然可能被泄露出去! 基础篇: 推荐1 谁出卖了你 << ...
- aspx代码审计-2
今天和大家分享一下aspx网站的代码审计,漏洞类型为:未授权访问和任意文件下载. 本文作者:i春秋签约作家——非主流 今天看的源码文件就不共享给大家了,本文只作学习只用. 还是先看我们的文件夹目录和d ...
- [Swift实际操作]八、实用进阶-(3)闭包在定时任务、动画和线程中的使用实际操作
闭包的使用相当广泛,它是可以在代码中被传递和引用的具有独立功能的模块.双击打开之前创建的空白项目.本文将演示闭包在定时任务.动画和线程中的使用.在左侧的项目导航区,打开视图控制器的代码文件:ViewC ...