Java反射技术学习总结

-------<a href="http://www.itheima.com/"">android培训</a>、<a href="http://www.itheima.com/"
">java培训</a>期待与您交流!----------

Java反射技术就是将java中的类的各个组成部分反射出来变为java中相应的数据类型获得。

Java同样将类中的各个组成部分进行封装,变为一个个Java类。

Class 字节码类。

其对象对应了Java中的字节码对象。其构造函数私有化。不能直接获得。可以通过以下方式获得。

第一种方式:当该类字节码文件已被加载到内存中时。

Class    类名.class  或  Class  对象名.getClass().

第二种方式:该类并还没有加载到内存。

Class.forName(String 类的全类名(即包名加类名))。

在Java中8个基本数据类型和Void对应了九个预定义的Class对象,用.Class方式获得。

Constructor  构造函数类

对应了Java中的构造函数。

该类同样不能直接new对象。获取该类的对象有两种情形。

一:获取公有的构造函数。

用Class对象的

Construcator   getConstrucator(class<?>.... typs);

二 获取非公有的构造函数

用Class对象的

Construcator   getDeclaredConstrucator(class<?>.... typs);

当我们获取了一个为私有private 修饰的构造函数,如果要使用该构造函数就必须将其设置为可访问状态。用Construcator对象的setAccessible(boolean falg).当参数为true时。该构造函数即为可访问状态。

Construcator 中有一个很常用的方法

newInstance(Object...intargs)

利用该构造函数创建一个与之相对的对象。

可以用这个方法创建对象。

Filed  成员变量类

该类对应了java中类的成员变量。

该类同样不能直接new对象。获取该类的对象有两种情形。

一:获取公有的用public修饰的Filed。

用Class对象的

Filed   getFiled(String name);

二 获取非公有的Filed

用Class对象的

Filed   getDeclaredFiled(String name);

当我们获取了一个为私有private 修饰的Filed,如果要使用该Filed就必须将其设置为可访问状态。用Filed对象的setAccessible(boolean falg).当参数为true时。该Filed即为可访问状态。

设置成员变量的值

用set(Oject obj,Object vaule)

将该成员变量的所属对象与要设置为的值传入。

Method   方法类

该类对应了Java中的方法,函数。

该类同样不能直接new对象。获取该类的对象有两种情形。

一:获取公有的函数。

用Class对象的

Method   getMethod(String name ,class<?>.... typs);

获取所有的公有方法。

Method[]           getMethods()

二 获取非公有的函数

用Class对象的

Method getDeclaredMethod(String name,class<?>.... typs);

当我们获取了一个为私有private 修饰的函数,如果要使用该函数就必须将其设置为可访问状态。用Method对象的setAccessible(boolean falg).当参数为true时。该函数即为可访问状态。

Method 有一个常用方法


Object


invoke(Object obj, Object... args)

对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。

执行调用该方法

暴力反射

何为暴力反射?

当我们用反射技术去获取一些为private修饰的字段,构造函数或方法时,就是暴力反射。

如何暴力反射在上面已讲过了。字段,构造函数,方法都有其获取私有对象的方法。

getDeclaredConstrucator(class<?>.... typs)

getDeclaredMethod(String name,class<?>.... typs)

getDeclaredFiled(String name)

如果要访问,使用私有的字段,构造函数或方法,就将其设为可访问状态。用setAccessible(boolean falg),参数传入true。

当我们用反射技术获取一个方法,用invoke(Object obj,Object...args)执行调用该方法时,要注意一种情况,就是该方法的参数是数组这一情形。

在JDK1.5之前 Method的invoke 是这样定义的

invoke(Object Object, Object[] obj[]).

现在的定义方法应用了java的新特性——可变参数。但是JDK1.5兼容了老版本。

所以当方法的参数是数组时,如果没有注意到这一点,我们在调用invoke方法时按照新的invoke方法定义的规则传参,将一个数组传入。就会出现参数格式异常。

这是因为JVM看到的参数是数组,就自动调用旧版本的invoke方法(都是兼容惹的祸)。该方法就会将数组拆包,将里面的元素们作为Metod的参数,但Method的参数明明是个数组。

那如何解决这个问题呢?以下代码给出答案

数组的反射

在java中相同维度及数据类型的数组的字节码对象是相等的。看一下下面代码就更清楚了。

int[]arr1=new int[3];

int[]arr2=new int [5];

String[]arr3=new String[]

Int[][]arr4=new int[3][4];

arr1.getClass()==arr2.getClass();true

arr1.getClass()==arr3.getClass();false

arr1.getClass()==arr4.getClass();false

我们都知道Java中所有类的父类都是Object。那么

Object[] obj1=arr3;

Object[] obj2=arr1;

应该是可以的。但实际是Object[] obj2=arr1;

不能通过编译。因为基本数据类型并不是Object类的子类。

这个细节在使用数组工具类Arrays时就有用武之地了。将数组转成集合有一个方法是asList(Object...obj)

当传入的是基本类型数组时,因为基本类型数组不能转换为Object[]。所以JVM不能在调用旧版本的方法asList[Object[] obj].将传入的数组拆包素组里的将元素转为集合里的元素,而是用新版本的方法将整个数组转换为集合里的一个元素。如下面代码

解决方法1.将数组的每个元素一个个传入asList方法。

第二种:将基本类型数组转换为其包装类数组。

Array

Array 类提供了动态创建和访问 Java 数组的方法。

Static   Object    get(Object array, int index)

返回指定数组对象中索引组件的值。

Static Object newInstance(Class<?> componentType, int length)

创建一个具有指定的组件类型和长度的新数组。

static int getLength(Object array)

以 int 形式返回指定数组对象的长度。

反射技术多用于框架的编写。我们现在或许没有达到写框架程序的境界,但学好反射有利于我们更好的学习使用一些框架进行编程。

-------<a href="http://www.itheima.com/"">android培训</a>、<a   href="http://www.itheima.com/"
">java培训</a>期待与您交流!----------

Java反射技术学习总结,布布扣,bubuko.com

时间: 2024-12-22 11:14:08

Java反射技术学习总结的相关文章

JAVA反射机制—学习总结

最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象. 什么是反射机制? "JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制."我们通过一些例子,更好理解反射机制.Class类 我们知道Java是一门面向对象

Java反射再学习

在最初学习Java的时候觉得反射真的好难,并不是技术负责,而是思想复杂,无法接受.随着工作经验的增多,今日偶然间又看见某智的一个视频,感觉茅塞顿开.顺便在此系统整理一下反射的知识. 一言以蔽之:反射就是将Java类的各个组成部分转换为对应的Java对象. 我们知道,一切皆对象,那么这个“一切”必然也包含了Java类啊,Java类也是一种事物,那么他是什么的对象呢?毫无疑问,Java类是Class类的对象.(PS:那么Class类又是谁的对象呢?求大神指教?这问题貌似无穷无尽啊 %>_<% )

Java多线程技术学习笔记(二)

目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和wait的区别 停止线程的方式 守护线程 线程的其他知识点 一.线程间的通信示例 返目录回 多个线程在处理同一资源,任务却不同. 假设有一堆货物,有一辆车把这批货物往仓库里面运,另外一辆车把前一辆车运进仓库的货物往外面运.这里货物就是同一资源,但是两辆车的任务却不同,一个是往里运,一个是往外运. 下面

Android中Java反射技术的使用示例

import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * Android中Java反射技术的使用示例 * 在Java中描述字节码文件(xxx.class)的类叫Class * 反射的过程可视为剖析Class的过

小怪兽 Java反射技术 等你来打

Java反射技术,是java的难点,也是程序员进化过程中的必打小怪兽,这里就根据java api好好研究一下java的反射技术. Class Fields Methods 请先回忆一下[java类的定义]. 一.反射是什么 反射是什么?百度百科这样定义:JAVA反射机制是在运行状态下,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取对象信息以及动态调用对象方法的功能称为java语言的反射机制. 可以这样理解,大家小时候有木有玩过平

java反射技术实例

java反射技术实例?1. [代码][Java]代码     package com.gufengxiachen.java.reflectiontest; public class Person {private String name;private int age;private static int total;public Person(){super();total++;}public Person(String name,int age){super();this.name=name

java 反射技术

什么是反射?反射就是将字节码中的各种成分映射到相应的java类中来,java反射技术自JDK1.1以来就出现了,目前大多数流行的框架都采用了这种技术,可见其重要性,这篇文章将详细介绍我对java反射技术的一些研究. 代表字节码对象的Class java中所有的类都有自己特有的一份字节码,当程序调用该类时,JVM便会将这份字节码装载到内存中来.在java中主要有三种方法来得到相应的字节码对象. 通过类的实例的getClass()方法获取,如 Class clazz=new Date().getCl

【软件工程】JAVA反射技术

JAVA反射技术 Java 反射技术应用广泛,它能够配置:类的全限定名.方法和参数,完成对象的初始化,甚至是反射某些方法.这样就可以大大增强 Java 的可配置’性, pring IoC 的基本原理也是如此,当然 Spring IoC 的代码要复杂得多. Java 的反射内容繁多,包括对象构建.反射方法.注解.参数.接口等. 通过反射构建对象 Java 中允许通过反射配置信息构建对象,比如 ReflectServicelmpl.java 然后通过反射的方法去构建它 这里的代码就是生成一个对象,然

Java反射技术

其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1.获得Class对象,就是获取到指定的名称的字节码文件对象. 2.实例化对象,获得类的属性.方法或构造函数. 3.访问属性.调用方法.调用构造函数创建对象. 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取.弊端:必须