java反射机制的简单使用
java 反射机制
反射机制简介 参考地址
- 什么是反射机制
反射机制指程序在运行时能够获取自身的信息。在java中只要给定类的名字,就可以通过反射机制获得类的所有信息 - 反射机制的优缺点
- 首先了解一下动态和静态的概念
- 静态编译:在编译时确定类型,绑定对象,即通过
- 动态编译:运行时确定类型,绑定对象。
- 反射机制的优点:
可以实现动态创建对象和编译,体现出很大的灵活性 - 反射机制的缺点:
对性能是有影响的,使用反射基本上是一种解释操作,这种操作总是慢于只直接执行相同的操作。
- 利用反射机制能获得什么信息
利用反射机制可以获得类中的所有信息,不过前提是得知道类的对象
反射机制的一些相关的代码
获取运行时类的对象的几种方法
import java.lang.reflect.Constructor;
import java.util.Arrays;
import org.junit.Test;
/**
*定义一个Worker类来作为示例
*/
class Worker{
String name;
int age;
int salary;
Worker() {
}
Worker(String name, int age, int salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
void show(){
System.out.println("姓名" + name);
System.out.println("年龄" + age);
}
public String toString() {
return "Worker [name=" + name + ", age=" + age + ", salary=" + salary
+ "]";
}
}
/**
*通过反射机制获取运行时类的对象的几种方法示例
*/
public class TestReflection {
public static void main(String[] args) throws Exception {
// 1.通过对象调用getClass方法得到运行时类的对象
Worker w1 = new Worker("Jhon", 20, 20000);
Class<Worker> clazz1 = (Class<Worker>) w1.getClass();
Worker w2 = (Worker)(clazz1.newInstance());
w2.show();
System.out.println(clazz1);
// 2.通过类来获取运行时类的对象
Class clazz2 = Worker.class;
System.out.println(clazz2);
// 3.通过Class.forName(String name)获得运行时类的对象
Class clazz3 = Class.forName("Worker"); //注:如果worker类不在缺省包中,括号里面要以包名开头
System.out.println(clazz3);
// 4.通过类的加载器来加载运行时类的对象
Class clazz4 = ClassLoader.getSystemClassLoader().loadClass("Worker"); //注:如果worker类不在缺省包中,括号里面要以包名开头
System.out.println(clazz4);
// 得到构造方法并调用对应对象的方法
Constructor constructor1 = clazz4.getDeclaredConstructor();
(clazz1.cast(constructor1.newInstance())).show();
Constructor constructor2 = clazz1.getDeclaredConstructor(String.class, int.class, int.class);
Object obj = constructor2.newInstance("Tom",20,20000);
System.out.println(obj);
Constructor[] constructors = clazz2.getDeclaredConstructors();
System.out.println(Arrays.toString(constructors));
}
}
java反射的通用代码
通过上面的代码可以获得 运行时类的对象,然后下面使用运行时类的对象来构造一个反射工具类,通过下面这个类 可以利用反射机制实例化该类的对象,设置对象的属性并调用对象的方法
import java.lang.reflect.Field;
import java.lang.reflect.Method;
//反射工具类
class ReflectionUtils{
//通过运行时类得到相应的对象
public static Object getObject(Class clazz) throws Exception{
//调用对应类的空构造方法,所以传进来的类的对象对应的类一定得有空的构造方法
return clazz.newInstance();
}
//设置对象属性
public static void setField(Object obj,String name,Object value) throws Exception{
Class clazz = obj.getClass();
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
field.set(obj, value);
}
//调用对象的方法
public static void setMethod(Object obj,String name,Object...args) throws Exception{
Class clazz = obj.getClass();
//定义Class数组来保存参数对应的类,得到方法时,要用到
Class [] clazzs = new Class[args.length];
for(int i=0;i<args.length;i++){
clazzs[i] = args[i].getClass();
}
Method method = clazz.getDeclaredMethod(name, clazzs);
method.invoke(obj, args);
}
}
本博客是根据上课老师讲的知识与网上的资料总结得来的,如需转载请注明出处:http://www.cnblogs.com/zhuchenglin/p/8005559.html
java反射机制的简单使用的更多相关文章
- java反射机制的简单介绍
参考博客: https://blog.csdn.net/mlc1218559742/article/details/52754310 先给出反射机制中常用的几个方法: Class.forName (& ...
- (转)java反射机制及简单工厂模式
第一步,定义一个接口类 package factory.face; /** * 接口,为了保证返回的对象可以统一用 Product接受 * @author Administrator */ publi ...
- Java反射机制的简单学习
今天看了一下Java的反射机制,就此记录一下. 首先,我们要先了解一下什么是反射? 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力. JAV ...
- 利用Java反射机制优化简单工厂设计模式
之前项目有个需求,审批流程的时候要根据配置发送信息:发送短信.发送邮件.当时看到这个就想到要用工厂模式,为什么要用工厂模式呢?用工厂模式进行大型项目的开发,可以很好的进行项目并行开发.就是一个程序员和 ...
- Java反射机制的简单应用
一直感觉java的反射机制非常强大,可是可用的地方不多.在android学习的时候.一直想实现挂断电话的功能,可是系统并没有提供开放的api接口,看了一下网上使用反射机制来实现该功能,确实非常强大,非 ...
- Java -- 浅入Java反射机制
1,Java 反射是Java语言的一个很重要的特征,它使得Java具体了"动态性". Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类. 在运行时构造任意一 ...
- java反射机制简单实例
目录 Java反射 简单实例 @(目录) Java反射 Java语言允许通过程序化的方式间接对Class进行操作.Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通 ...
- Java反射机制剖析(三)-简单谈谈动态代理
通过Java反射机制剖析(一)和Java反射机制剖析(二)的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制. 1. 代理模式 代理模式就是为其他对象提供一种代理来 ...
- Java反射机制 —— 简单了解
一.概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...
随机推荐
- luogu P5287 [HNOI2019]JOJO
传送门 神™这题暴力能A,这出题人都没造那种我考场就想到的数据,难怪我的垃圾做法有分 先考虑没有撤销操作怎么做,因为每次插入一段一样的字符,所以我们可以把\(x\)个字符\(c\)定义为\(cx\), ...
- 移动端click事件300ms延迟
移动端click 事件延迟300ms 一般情况下,如果没有经过特殊处理,移动端浏览器在派发点击事件的时候,通常会出现300ms左右的延迟.也就是说,当我们点击页面的时候移动端浏览器并不是立即作出反应, ...
- Lua中的模块与包
[前言] 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个 ...
- 008_ssl Certificate Pinning
证书锁定Certificate Pinning技术 在中间人攻击中,攻击主机通常截断客户端和服务器的加密通信.攻击机以自己的证书替代服务器发给客户端的证书.通常,客户端不会验证该证书,直接接受该证书, ...
- Charles 抓包的简单使用
1.准备工具: 软件 Charles 手机 随意哪个现代手机 2.基本配置 安装Charles的电脑和手机在同一个局域网下, 点击手机上的和电脑练得同一个局域网的名字进行配置,里面有个代理,选择手动, ...
- mysql查看实时连接数
怎么实时查看mysql当前连接数 如何实时查看mysql当前连接数? 1.查看当前所有连接的详细资料:./mysqladmin -uadmin -p -h10.140.1.1 processlist ...
- POJ 3104 Drying
最让HSQ学长头疼的就是洗衣服了.洗完之后,每件衣服都有一定单位水分,在不使用烘干器的情况下,每件衣服每分钟自然流失1个单位水分,但如果使用了烘干机则每分钟流失K个单位水分.令人遗憾是HSQ所在的宿舍 ...
- iOS -- Effective Objective-C 阅读笔记 (4)
1: 在 对象内部 尽量 直接访问 实例变量 在对象之外访问实例变量时, 总是应该通过属性来访问, 然而在对象内部, 在读取实例变量的时候尽量采用 直接访问的形式, 而在设置实例变量的时候通过属性来做 ...
- Python学习笔记九
Python学习笔记之九 为什么要有操作系统 管理硬件,提供接口. 管理调度进程,并且将多个进程对硬件的竞争变得有序. 操作系统发展史 第一代计算机:真空管和穿孔卡片 没有操作系统,所有的程序设计直接 ...
- 金蝶K3 WISE BOM多级展开_物料齐套表
/****** Object: StoredProcedure [dbo].[pro_bobang_ICItemQiTao] Script Date: 07/29/2015 16:12:10 **** ...