Java核心反射机制:

基本反射:

反射是一种动态类的处理机制,通过Class类来实现反射机制;

Class类的基本信息:

Module java.base
Package java.lang
Class Class<T>
java.lang.Object
java.lang.Class<T>

以下三种方式获得类的反射,三者都非常重要,牢牢掌握。

  1. 利用Object类中提供getClass()方法获取实例化对象
class Member {}
public class JavaReflectDemo {
public static void main(String[] args) throws Exception {
// 【操作特点】需要获取一个类的实例化对象之后才可以获取Class类实例
Member member = new Member() ; // 实例化Member类对象
Class<?> clazz = member.getClass() ; // 获取Class类实例化对象
System.out.println(clazz);
}
}
  1. 使用“类.class”形式
class Member {}
public class JavaReflectDemo {
public static void main(String[] args) throws Exception {
// 【操作特点】直接通过一个类的完整名称可以获取Class类实例,需要编写import或编写完整类名称
Class<?> clazz = Member.class ; // 获取Class类实例化对象
System.out.println(clazz);
}
}
  1. 使用Class类内部提供的forName()方法根据类的完整名称获取实例化对象
class Member {}
public class JavaReflectDemo {
public static void main(String[] args) throws Exception {
// 【操作特点】通过名称字符串(包.类)可以获取Class类实例,可以不使用import导入
// 获取Class类实例化对象
Class<?> clazz = Class.forName("cn.xbhog.demo.Member");
System.out.println(clazz);
}
}

反射获取实例化对象:

package com.xbhog.反射机制;
class Member{
public Member() { // 构造方法
System.out.println("【构造方法】实例化Member类对象.");
}
@Override
public String toString() {
return "【toString()覆写】博客地址:http://www.cnblogs.com/xbhog";
} }
public class 反射获取对象 {
public static void main(String[] args) throws Exception {
// 获取Class类实例化对象
Class<?> clazz = Class.forName("com.xbhog.反射机制.Member");
// 反射机制可以获取任意类实例化对象(等价于关键字“new”),所以返回的类型为Object
Object obj = clazz.getDeclaredConstructor().newInstance() ;// 实例化对象
System.out.println(obj);
}
}

反射的机制可以更加方便开发者实现解耦和设计;

反射与类操作:

在反射机制下,可以自动获取并调用任意一个类中的组成结构(成员属性、方法),使得代码的编写更加灵活。

反射获取类结构:

package com.xbhog.反射机制;
interface IMessage{
public void send();
}
interface IChannelService{
public Boolean connect();
} abstract class AbstractBase{}
public class Mail extends AbstractBase implements IMessage,IChannelService{
@Override
public void send() {
if(this.connect()){
System.out.println("发送信息成功");
}
} @Override
public Boolean connect() {
return true;
}
}
package com.xbhog.反射机制;
public class MailTest {
public static void main(String[] args) {
Class<Mail> aClass = Mail.class;
System.out.println(aClass.getPackage()); //获取类的包名
Class<? super Mail> superclass = aClass.getSuperclass(); //获取父类对象信息
System.out.println(superclass.getName()); //获取父类名字
System.out.println(superclass.getSuperclass().getName()); //获取父类的父类的名字 /*获取接口信息*/
Class<?>[] interfaces = aClass.getInterfaces();
for (Class<?> anInterface : interfaces) {
System.out.println(anInterface.getName());
}
}
}

反射调用构造方法:

反射还可以调用构造方法,构造方法是类中的重要组成部分,也是实例化对象时必须调用的方法。

实例:

import java.lang.reflect.Constructor;
class Mail {
private String msg ;
public Mail() {}// 无参构造
public Mail(String msg) {// 单参构造
System.out.println("【构造方法】调用Mail类单参构造方法,实例化对象");
this.msg = msg ;
}
@Override
public String toString() { // 对象信息
return "【toString()覆写】消息内容:" + this.msg;
}
}
public class JavaReflectDemo {
public static void main(String[] args) throws Exception {
Class<?> cls = Mail.class ; // 获取指定类的Class对象
Constructor<?>[] constructors = cls.getDeclaredConstructors() ; // 获取全部构造
for (Constructor<?> cons : constructors) {
System.out.println(cons);
}
// 获取单参构造并且参数类型为String的构造方法对象实例
Constructor<?> cons = cls.getDeclaredConstructor(String.class) ;
Object obj = cons.newInstance("www.cnblog.cn/xbhog") ;// 调用单参构造实例化对象
System.out.println(obj);
}
}

反射调用方法:

反射机制中除了获取类中的方法定义外,最为重要的功能就是可以利用Method类中的invoke()方法并结合实例化对象(Object类型即可)实现放射的调用。

反射调用类中的setter、getter方法(重点)

package com.xbhog.反射机制.方法;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; class Member{
private String name;
public void setName(String name){
this.name = name; }
public String getName(){
return this.name;
}
} public class getter_Setter {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class<?> cls = Member.class;
String value = "xbhog";
//实例化Member对象
Object obj = cls.getDeclaredConstructor().newInstance();
//反射调用方法需要明确的知道方法的名称以及方法中的参数类型
String setMethodName ="setName";
Method setmethod = cls.getDeclaredMethod(setMethodName, String.class); //获取指定方法
setmethod.invoke(obj,value); //对象.setName(value)
String getMethodName = "getName";
Method getMethod = cls.getDeclaredMethod(getMethodName); //get没有参数
System.out.println(getMethod.invoke(obj));//对象.getName();
}
}

通过放射实现的方法调用的最大的特点是可以直接利用Object类型的实例化对象进行调用的,但是在获取对象时需要明确的知道方法名称以及方法的参数类型。

Field类的作用:

在实际开发中,Field中的getType()方法使用的较多,可以通过其来确定属性的类型

示例:

import java.lang.reflect.Field;

class Member{
private String name;
public void setName(String name){
this.name = name; }
public String getName(){
return this.name;
}
}
public class FIeldDemo {
public static void main(String[] args) throws Exception {
//获取Member类
Class<?> cls = Member.class;
//实例化
Object obj = cls.getDeclaredConstructor().newInstance();
//成员属性name的类型
Field name = cls.getDeclaredField("name");
//获取详细信息
System.out.println(name.getType().getName());
//获取简略信息
System.out.println(name.getType().getSimpleName());
}
}

结果:

java.lang.String

String

Java核心反射机制的更多相关文章

  1. java笔录---反射机制(1)

    引言   为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架,   像spring中核心模块IO ...

  2. Java高新技术 反射机制

     Java高新技术 反射机制 知识概要:                   (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...

  3. 【转】java原理—反射机制

    一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言 ...

  4. 深入浅出学习hibernate框架(三):java的反射机制

    上篇博客写到了JDBC的基本操作,今天准备写一篇关于JAVA反射机制的文章,因为java的反射机制和上一篇JDBC都是Hibernate框架的基本要素.在Hibernate的运行机制中,这两块的内容正 ...

  5. java原理—反射机制

    http://www.cnblogs.com/forlina/archive/2011/06/21/2085849.html 一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程 ...

  6. 学习:java原理—反射机制

      一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提 出很快引发了计算机科学领域关于应用反射性的研究.它首先被程 ...

  7. 浅谈Java的反射机制和作用

    浅谈Java的反射机制和作用 作者:Java大师 欢迎转载,转载请注明出处 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象 ...

  8. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  9. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

随机推荐

  1. Msf--永恒之蓝 ms17_010

    |>>>中华人民共和国网络安全法<<<|警告:请勿用于非法用途,后果自负! 简介 一.概述 永恒之蓝是指2017年4月14日晚,黑客团体Shadow Brokers ...

  2. C语言规范:C89、C90、C95、C99

    本文转载 [K&R C] 1978 年,Dennis Ritchie 和 Brian Kernighan 合作推出了<The C Programming Language>的第一版 ...

  3. spark算子优化

    一.在聚合前在map端先预聚合 使用reduceByKey/aggregateByKey代替groupByKey 二.一次处理一个分区的数据,不过要注意一个分区里的数据不要太大,不然会报oom * 使 ...

  4. 『动善时』JMeter基础 — 28、JMeter函数助手详解

    目录 1.函数助手介绍 2.函数助手中的函数分类 3.常用函数介绍 (1)__Random函数 (2)__counter函数 (3)__time函数 (4)__property函数 (5)__setP ...

  5. 【odoo】【知识点】视图的继承逻辑

    背景:同一个模块,两组开发人员对同一个模型的form视图进行了二开.在没有指定外部ID的情况下,odoo是如何选择展示展示哪个视图呢? 上干货 odoo在加载视图的时候,首先调用的models.py中 ...

  6. 达梦数据库产品支持技术学习分享_Week2

    本周主要从以下几个方面进行本人对达梦数据库学习的分享,学习进度和学习情况因人而异,仅供参考. 一.文本命令行工具使用的方法(Disql和dmfldr) 二.数据库备份 三.定时作业功能 四.系统表和动 ...

  7. VTA硬件

    VTA硬件 提供了VTA硬件设计的自上而下的概述.本硬件设计涵盖两个级别的VTA硬件: VTA设计及其ISA硬件-软件接口的体系结构概述. VTA硬件模块的微体系结构概述以及计算核心的微代码规范. V ...

  8. Amazon SageMaker和NVIDIA NGC加速AI和ML工作流

    Amazon SageMaker和NVIDIA NGC加速AI和ML工作流 从自动驾驶汽车到药物发现,人工智能正成为主流,并迅速渗透到每个行业.但是,开发和部署AI应用程序是一项具有挑战性的工作.该过 ...

  9. AI框架精要:设计思想

    AI框架精要:设计思想 本文主要介绍飞桨paddle平台的底层设计思想,可以帮助用户理解飞桨paddle框架的运作过程,以便于在实际业务需求中,更好的完成模型代码编写与调试及飞桨paddle框架的二次 ...

  10. 中国摄像头CMOS需求潜力旺盛

    中国摄像头CMOS需求潜力旺盛 CMOS是Complementary Metal Oxide Semiconductor(互补金属氧化物半导体)的缩写.它是指制造大规模集成电路芯片用的一种技术或用这种 ...