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的反射 基础+简单复制对象实例相关推荐

  1. java反射之获取class对象,Java之反射机制(获取Class对象的三种方式)

    Java之反射机制(获取Class对象的三种方式) 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-14 如何得到各个字节码对应的实例对象? 每个类被加 ...

  2. Java的反射基础与常用方法

    一.什么是java反射 java的反射机制是指在运行状态中,对于任意的一个类,都能获取到这个类的属性和方法,无论是private还是public.对于任意的一个对象,都能调用到它的任意一个方法和属性, ...

  3. 反射第一篇,学习Java的反射基础

    反射基础 什么是反射? 反射的使用 介绍:类对象 获取类对象 类对象的方法简介 使用:利用反射创建对象 例 调用特定构造方法 使用:获取成员变量并修改 例 使用:获取成员方法并调用 例 调用特定方法 ...

  4. Java反射基础(一)--Class对象获取

    Classes Java中,任何一个对象要么是一个引用类型要么是基本数据类型.引用类型指的是那些直接或间接 Java.lang.Object的类.Classse,enum,和接口都是应用类型.基本类型 ...

  5. java反射基础_Java反射基础(一)--Class对象获取

    ClassesJava中,任何一个对象要么是一个引用类型要么是基本数据类型.引用类型指的是那些直接或间接 Java.lang.Object的类.Classse,enum,和接口都是应用类型.基本类型是 ...

  6. Java反射基础(三)--Methods对象的使用

    Method 原文地址:http://docs.oracle.com/javase/tutorial/reflect/member/method.html 1.获得方法类型信息 一个方法的声明包括方法 ...

  7. Java反射基础(二)--Fileds对象的使用

    在说Filed之前,我们先来了解一下Member接口. 反射中定义了一个接口 java.lang.reflect.Member . java.lang.reflect.Field, java.lang ...

  8. JAVA中反射的简单例子

    java反射是指程序可以访问,检测和修改它本身状态或行为的一种能力.这里我们要了解类对象这个概念,类对象不是类的对象,而是把一个类整体当做一个对象,利用这个方法我们在后期就可以方便的修改某个类. 这里 ...

  9. JAVA 之反射(基础概念) 几个主要常用的重要的方法

    什么叫JAVA反射机制? 能够动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制. 通过反射机制,能做什么? 正常的编译是将处于JVM中的字节码(CLASS文件)进行处理 可以在程序 ...

  10. 【Java.JMS】一个简单的JMS实例

    选择ActiveMQ. 建立一个简单的Maven工程,pom.xml如下: <project xmlns="http://maven.apache.org/POM/4.0.0" ...

最新文章

  1. javascript面向对象技术基础(二)
  2. 【Python】分享14条非常实用的Pandas函数方法,建议珍藏!!
  3. 2021 网易创新企业大会来了
  4. SAP CRM中间件下载equipment时遇到的一个错误
  5. 信号量、使用信号量来完成读写模型(消费者生产者模型)线程池、读写锁面试题
  6. codewars033: Duplicate Encoder 重复编码器
  7. 前端VUE完成截取当前页面转PDF,支持分页
  8. PostgreSQL客户端安装
  9. 游戏算法整理(贴图完整版)
  10. 关于雇用和解雇的词汇
  11. 【微信小程序宝典】从零开始做微信小程序开发
  12. cmd删除Windows凭据管理器
  13. flex布局设置宽度不生效,高度生效
  14. 解决latex提示Warning: Font shape `TU/phv/m/n‘ undefined (Font)
  15. 【问题】【实用】java服务假死【CLOSE_WAIT】【线程WAITING】
  16. Java——Error running exam-web: Adress localhost:1099 is already in use
  17. Ubuntu重置密码 passwd 出现 Authentication token manipulation error
  18. 文件的基本操作--利用爬取的王者荣耀李信台词进行练习
  19. 如何将邮件导出为PDF
  20. python制作手机壁纸_用Python生成自己专属的手机春节壁纸

热门文章

  1. python3 列表取交集_一刻钟学会 Python 3!Python不难学啊!
  2. pycharm查询mysql数据库_pycharm访问mysql数据库的方法步骤
  3. 【power designer】使用power designer编辑pdm物理模型图时,为字段添加中文备注
  4. Cesium 显示CZML数据
  5. 关于HP C7K的firmware management中的power policy理解
  6. bootstrap自定义分页
  7. Android引领移动互联网革命的七大理由
  8. 201111-W-网络技术-基础理论与应用说明
  9. Qt warning : 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
  10. opencv获取mat的指针_opencv中Mat类型数据操作与遍历