Java的反射 基础+简单复制对象实例
1. 要想使用反射,首先需要获得待处理类或对象所对应的 Class对象。
2. 获取某个类或某个对象所对应的 Class对象的常用的 3种方式:
a) 使用Class类的静态方法 forName:
Class.forName(“java.lang.String”);
b) 使用类的.class语法:
String.class;
c) 使用对象的 getClass()方法:
String s = “aa”; Class<?> clazz = s.getClass();
3. 若想通过类的不带参数的构造方法来生成对象,我们有两种方式:
a) 先获得Class对象,然后通过该 Class对象的newInstance()方法直接生成即可:
Class<?> classType = String.class;
Object obj = classType.newInstance();
b) 先获得Class对象,然后通过该对象获得对应的 Constructor 对象,再通过该 Construct对象的newInstance()方法生成:
Class<?> classType = Customer.class; Constructor cons = classType.getConstructor(new Class[]{}); Object obj = cons.newInstance(new Object[]{});
4. 若想通过类的带参数的构造方法生成对象,只能使用下面这一种方式:
Class<?> classType = Customer.class; Constructor cons = classType.getConstructor(new Class[]{String.class, int.class}); Object obj = cons.newInstance(new Object[]{“hello”, 3});
5.使用反射的方法复制一个对象:
public class ReflectTester{// 该方法实现对Customer对象的拷贝操作 public Object copy(Object object) throws Exception { //见上文3(b) Class<?> classType = object.getClass(); Object objectCopy = classType.getConstructor(new Class[] {}) .newInstance(new Object[] {}); // 获得对象的所有成员变量 Field[] fields = classType.getDeclaredFields();for (Field field : fields) { String name = field.getName(); String firstLetter = name.substring(0, 1).toUpperCase();// 将属性的首字母转换为大写 String getMethodName = "get" + firstLetter + name.substring(1); String setMethodName = "set" + firstLetter + name.substring(1); Method getMethod = classType.getMethod(getMethodName,new Class[] {}); Method setMethod = classType.getMethod(setMethodName,new Class[] { field.getType() }); Object value = getMethod.invoke(object, new Object[] {}); //invoke()方法的第一个参数是指调用Method的对象,第二个参数是Method的参数 详见API setMethod.invoke(objectCopy, new Object[] { value }); }return objectCopy; } public static void main(String[] args) throws Exception { Customer customer = new Customer("Tom", 20); customer.setId(1L); //1L为Long型的1. ReflectTester test = new ReflectTester(); Customer customer2 = (Customer) test.copy(customer); System.out.println(customer2.getId() + "," + customer2.getName() + "," + customer2.getAge()); }}/* * Customer Bean*/class Customer{private Long id; private String name; private int age; public Customer() { } public Customer(String name, int age) {this.name = name;this.age = age; } public Long getId() {return id; } public void setId(Long id) {this.id = id; } public String getName() {return name; } public void setName(String name) {this.name = name; } public int getAge() {return age; } public void setAge(int age) {this.age = age; }}
总结一下反射的过程:
通过对象得到类型
Class<?> classType = object.getClass();
或者通过类名取得类型
Class<?> classType = Class.forName("类名")
通过生成一个Method对象
Method setMethod = classType.getMethod(setMethodName(方法名),new Class[] { field.getType() } (参数));
然后调用Object value = setMethod.invoke(object(谁调用这个方法), new Object[] {}(参数));
本文为<北京圣思园Java培训教学视频Java.SE 反射机制大总结>视频笔记
转载于:https://www.cnblogs.com/myfjd/archive/2012/01/13/2322056.html
Java的反射 基础+简单复制对象实例相关推荐
- java反射之获取class对象,Java之反射机制(获取Class对象的三种方式)
Java之反射机制(获取Class对象的三种方式) 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-14 如何得到各个字节码对应的实例对象? 每个类被加 ...
- Java的反射基础与常用方法
一.什么是java反射 java的反射机制是指在运行状态中,对于任意的一个类,都能获取到这个类的属性和方法,无论是private还是public.对于任意的一个对象,都能调用到它的任意一个方法和属性, ...
- 反射第一篇,学习Java的反射基础
反射基础 什么是反射? 反射的使用 介绍:类对象 获取类对象 类对象的方法简介 使用:利用反射创建对象 例 调用特定构造方法 使用:获取成员变量并修改 例 使用:获取成员方法并调用 例 调用特定方法 ...
- Java反射基础(一)--Class对象获取
Classes Java中,任何一个对象要么是一个引用类型要么是基本数据类型.引用类型指的是那些直接或间接 Java.lang.Object的类.Classse,enum,和接口都是应用类型.基本类型 ...
- java反射基础_Java反射基础(一)--Class对象获取
ClassesJava中,任何一个对象要么是一个引用类型要么是基本数据类型.引用类型指的是那些直接或间接 Java.lang.Object的类.Classse,enum,和接口都是应用类型.基本类型是 ...
- Java反射基础(三)--Methods对象的使用
Method 原文地址:http://docs.oracle.com/javase/tutorial/reflect/member/method.html 1.获得方法类型信息 一个方法的声明包括方法 ...
- Java反射基础(二)--Fileds对象的使用
在说Filed之前,我们先来了解一下Member接口. 反射中定义了一个接口 java.lang.reflect.Member . java.lang.reflect.Field, java.lang ...
- JAVA中反射的简单例子
java反射是指程序可以访问,检测和修改它本身状态或行为的一种能力.这里我们要了解类对象这个概念,类对象不是类的对象,而是把一个类整体当做一个对象,利用这个方法我们在后期就可以方便的修改某个类. 这里 ...
- JAVA 之反射(基础概念) 几个主要常用的重要的方法
什么叫JAVA反射机制? 能够动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制. 通过反射机制,能做什么? 正常的编译是将处于JVM中的字节码(CLASS文件)进行处理 可以在程序 ...
- 【Java.JMS】一个简单的JMS实例
选择ActiveMQ. 建立一个简单的Maven工程,pom.xml如下: <project xmlns="http://maven.apache.org/POM/4.0.0" ...
最新文章
- javascript面向对象技术基础(二)
- 【Python】分享14条非常实用的Pandas函数方法,建议珍藏!!
- 2021 网易创新企业大会来了
- SAP CRM中间件下载equipment时遇到的一个错误
- 信号量、使用信号量来完成读写模型(消费者生产者模型)线程池、读写锁面试题
- codewars033: Duplicate Encoder 重复编码器
- 前端VUE完成截取当前页面转PDF,支持分页
- PostgreSQL客户端安装
- 游戏算法整理(贴图完整版)
- 关于雇用和解雇的词汇
- 【微信小程序宝典】从零开始做微信小程序开发
- cmd删除Windows凭据管理器
- flex布局设置宽度不生效,高度生效
- 解决latex提示Warning: Font shape `TU/phv/m/n‘ undefined (Font)
- 【问题】【实用】java服务假死【CLOSE_WAIT】【线程WAITING】
- Java——Error running exam-web: Adress localhost:1099 is already in use
- Ubuntu重置密码 passwd 出现 Authentication token manipulation error
- 文件的基本操作--利用爬取的王者荣耀李信台词进行练习
- 如何将邮件导出为PDF
- python制作手机壁纸_用Python生成自己专属的手机春节壁纸
热门文章
- python3 列表取交集_一刻钟学会 Python 3!Python不难学啊!
- pycharm查询mysql数据库_pycharm访问mysql数据库的方法步骤
- 【power designer】使用power designer编辑pdm物理模型图时,为字段添加中文备注
- Cesium 显示CZML数据
- 关于HP C7K的firmware management中的power policy理解
- bootstrap自定义分页
- Android引领移动互联网革命的七大理由
- 201111-W-网络技术-基础理论与应用说明
- Qt warning : 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
- opencv获取mat的指针_opencv中Mat类型数据操作与遍历