反射其实就是指在超脱规则的束缚,从强引用到弱相关,在上帝视角做事情,对于写配置文件,和一些框架的源码,得到调用上至关重要,java带有解释器的语法特性,使得泛型一类的语法糖和反射配合之后更如鱼得水!

反射其实就是通过获得一个类的Class对象来进行操作,从而得到Constructor(构造方法:包括非共有;private、无类型、protected)对象、Method(方法:包括非共有;private、无类型、protected)对象和Field(变量,这个解释我也觉得不够准确:包括非共有;private、无类型、protected)对象来进行我们能够想象的所有操作!

Class类

得到类名称,类的实现的接口,继承类。

获得Class对象的三种方式:

1.类名.class;(依赖性较强,需要其中的import的支持)

Class c1 = Student.class;

2.Class.forName("全类名");(通过forName来加载,依赖性比较低)

Class c2 = Class.forName("c_flect.entity.Student");

3.对象.getClass();(一种单纯使用大多数时候,比较鸡肋的方法:通过对象来获得Class对类对象)

Class c3 = new Student().getClass();

常用方法:

getName() 获得全类名
getSimpleName() 仅获得当前类名
getSuperclass() 获得父类的名称(全类名)

getInterfaces()

返回值是Class[]数组,所有实现接口
涉及Constructor的
getConstructor 获取特定公开构造方法
getConstructors 获取所有公开构造方法
getDeclaredConstructor 获取特定的声明构造(包括非公开)
getDeclaredConstructors 获取所有的声明构造(包括非公开)
涉及Method的
getMethod 获取特定公开方法
getMethods 获取所有公开方法
getDeclaredMethod 获取特定的声明方法(包括非公开)
getDeclaredMethods 获取所有的声明方法(包括非公开)
涉及到Field的
getField 获取特定公开变量
getFields 获取所有公开变量
getDeclaredField 获取特定的声明变量(包括非公开)
getDeclaredFields 获取所有的声明变量(包括非公开)
其中需要注意的点:

1.所有如果是私有的构造方法、方法和变量要先setAccessible(true);才能进行使用

2.在get constructor、method和feild的时候,所有其中的形参类型,都是类型的.class Class对象

3.constructor最后newInstance就行了,method执行时调用invoke,field执行时调用set

4.method执行和field执行都要在执行方法的第一个位置传参传入执行此方法的对象(此方法的提供对象)

开始贴代码,使用junit测试:

package c_flect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method; import org.junit.Test; import c_flect.entity.Student; /**
* 反射复习:
* Class类,代表类。
* 得到类名称,类的实现的接口,继承类。
* Constructor类,代表类的构造方法。
* 构造对象。
* Method类,代表类的普通方法。
* 调用方法。
* Field类,代表类的属性。
* 得到属性值,设置属性值。
* @author mzy
*/
public class Demo01 {
/**
* Class类:
* 测试得到Class类对象的三种方式回忆!
*/
// @Test
public void test01() throws Exception {
// 1.依赖性较强,需要其中的import的支持
Class c1 = Student.class;
// 2.通过forName来加载,依赖性比较低
Class c2 = Class.forName("c_flect.entity.Student");
// 3.一种单纯使用大多数时候,比较鸡肋的方法:通过对象来获得Class对类对象
Class c3 = new Student().getClass(); // 得到类名
System.out.println(c1 == c2);
System.out.println(c2 == c3); System.out.println(c1.getName()); // 得到类的全名
System.out.println(c2.getSimpleName()); // 得到简单名
// 得到类的继承的结构:得到当前的Student的父类
System.out.println(c1.getSuperclass().getSimpleName()); // 得到类的接口
Class[] interArray = c1.getInterfaces();
for (Class c : interArray) {
System.out.println(c.getSimpleName());
}
} /**
* Constructor类:
* 构造对象
*/
@Test
public void test02() throws Exception {
// 通过Class类得到Constructor类
Class c = Class.forName("c_flect.entity.Student");
/*
* 获取所有的构造方法
* 但是获取到了所有的构造之后并并不好用,获取想要的才是最好的
* 统计有多少个构造方法可能有用。
*/
/*
Constructor[] constructors = c.getConstructors();
for(Constructor con : constructors) {
System.out.println(con);
}
*/ /*
* 1.调用无参构造
*/
Constructor cons1 = c.getConstructor(null);
// 通过Constructor构造对象
Object o1 = cons1.newInstance(null);
// System.out.println(o1.getClass().getSimpleName());
System.out.println(o1);
/*
* 2.调用有参构造:私有
*/
Constructor cons2 = c.getDeclaredConstructor(int.class, String.class);
// 设置这个私有构造的访问权限为true
cons2.setAccessible(true);
Object o2 = cons2.newInstance(19, "mzy");
// System.out.println(o2.getClass().getSimpleName());
System.out.println(o2);
} /**
* Method类:
* 类的普通方法,调用
*/
@Test
public void test03() throws Exception {
// 1.通过Class类 对象得到Method类对象
Class c = Class.forName("c_flect.entity.Student");
// Object o = c.getConstructor(null).newInstance(null);
/*
* 同上:只有无参构造才可以这样简化!
* 有参构造必须 先getConstructor
* 再newInstance这种形式,或者
* getConstructor(int.class, String.class).newInstance(20, "mzy");
*/
Object o = c.newInstance(); Method setName = c.getMethod("setName", String.class); // 如果有多个参数,跟在后面就行了
/*
* 2) 通过Method对象来调用方法
* Method对象调用方法
* 需要把要调用此方法的对象传入
* 后面跟上参数值
*/
setName.invoke(o, "mzy");
System.out.println(o); Constructor cons = c.getDeclaredConstructor(int.class, String.class, int.class);
cons.setAccessible(true); Object o2 = cons.newInstance(18, "zxr", 168);
Method getHeight = c.getDeclaredMethod("getHeight", null);
getHeight.setAccessible(true);
Object res = getHeight.invoke(o2, null);
System.out.println("height = "+res);
System.out.println(o2);
} /**
* Field类:
* 得到属性值,设置属性值。
*/
@Test
public void test04() throws Exception {
// 1) 通过Class得到Field类对象
Class c = Class.forName("c_flect.entity.Student");
// Object o = c.getConstructor(null).newInstance(null);
Object o = c.newInstance();
// 共有属性很简单,这里就演示非共有属性访问!
Field field = c.getDeclaredField("name");
field.setAccessible(true);
field.set(o, "mzy");
System.out.println(o);
}
}

其中调用的Student类:

package c_flect.entity;

public class Student implements Person, Child{
private int age;
private String name;
private int height; public Student() { } private Student(int age, String name) {
this.age = age;
this.name = name;
} private Student(int age, String name, int height) {
this.age = age;
this.name = name;
this.height = height;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} private int getHeight() {
return height;
} public void setHeight(int height) {
this.height = height;
} @Override
public String toString() {
return "Student [age=" + age + ", name=" + name + "]";
} }

mzy对于反射的复习的更多相关文章

  1. java 反射机制复习笔记。

    1.java 反射的作用(好处): (1)能够使我们很方便的创建灵活的代码,这些代码可以在运行时装配(运行时获取一个类实例),就不用在组件之间进行源代码链接了,大大提高系统的灵活性和扩展性. (2)与 ...

  2. 9.12DjangoORM回顾和路由.

    2018-9-12 13:44:41 周末继续整理一下博客!不知不觉记了好多! 越努力越幸运! 永远不要高估自己! 关于反射的复习 # /usr/bin/env python # -*- coding ...

  3. JNI_day02

    二级指针 指向指针变量的指针,保存指针的地址 结构体 struct Student //struct Stdent 学生结构体类型 { int id;//成员 char name[20]; int a ...

  4. JDBC01 获取数据库连接

    概述 Java Database Connectivity(JDBC)直接访问数据库,通用的SQL数据库存取和操作的公共接口,定义访问数据库的标准java类库(java.sql,javax.sql) ...

  5. 2018年底,IOS面试题的复习之OC的反射机制

    明天要去面试一个公司,今天复习下IOS题目吧 1.说一下OC的反射机制 答:OC的反射机制类似于JAVA的反射机制,这种动态反射机制可以让OC语言更加灵活.这句话是对反射机制的初步认识,具体表现在哪里 ...

  6. python 全栈开发,Day23(复习,isinstance和issubclass,反射)

    一.复习 class A: def func1(self):pass def func2(self): pass def func3(self): pass a = A() b = A() print ...

  7. java8--类加载机制与反射(java疯狂讲义3复习笔记)

    本章重点介绍java.lang.reflect包下的接口和类 当程序使用某个类时,如果该类还没有被加载到内存中,那么系统会通过加载,连接,初始化三个步骤来对该类进行初始化. 类的加载时指将类的clas ...

  8. Java基础复习笔记系列 十三 反射机制

    主题:Java反射机制 学习资料参考网址: 1.http://www.icoolxue.com 1.Java反射机制. 各种框架中都使用到了Java的反射机制. 两个类:java.lang.Class ...

  9. C#复习反射

    反射中常用方法: //获取对象类型 One one = new One(); Type t = one.GetType(); //动态加载 Assembly a = Assembly.LoadFile ...

随机推荐

  1. 初探SpringRetry机制

    重试是在网络通讯中非常重要的概念,尤其是在微服务体系内重试显得格外重要.常见的场景是当遇到网络抖动造成的请求失败时,可以按照业务的补偿需求来制定重试策略.Spring框架提供了SpringRetry能 ...

  2. airodump-ng的使用及显示

    PWR   表示所接收的信号的强度.表示为负数,数值赿大表示信号赿强.(绝对值赿大,数据赿值小) beacons  表示网卡接收到的AP发出的信号个数

  3. Java多线程(上)

    Java多线程 程序.进程和线程 一.程序 程序是存储在磁盘上, 包含可执行机器指令和数据的静态实体. 即进程或者任务是处于活动状态的计算机程序. 二.进程 进程是资源(CPU.内存等)分配的基本单位 ...

  4. 扩展欧几里得(exgcd)-求解不定方程/求逆元

    贝祖定理:即如果a.b是整数,那么一定存在整数x.y使得ax+by=gcd(a,b).换句话说,如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍.(可以来判断一个这样的式子有没有解)有一个 ...

  5. ts 学习笔记 - 类

    目录 类 类的概念 类的用法 属性和方法 类的继承 存取器 静态属性 Typescript 中的用法 抽象类 类的类型 类与接口 类实现接口 接口继承接口 接口继承类 混合类型 类 类的概念 类 (c ...

  6. jvm源码解读--18 Java的start()方法解读 以及 wait 和notify流程图

    drawwed by 张艳涛 and get info from openjdk8 还有一个图

  7. 基于ifix组态软件研究控制按钮权限

    背景: 在前阵子做基于ifix生成电力监控平台时,遇到业主提出的一个需求.关于如何在控制弹窗中,点击相应的合分闸按钮时,优先弹出登录界面,当输入相应的有权限用户名和密码后,才能操作这一要求.后实现如下 ...

  8. 【Java经验分享篇01】小白如何开始学会看开源项目?

    目录 前言 1.理解开源 1.1.什么是开源? 1.2.开源的定义 1.2.1.开源软件优点 1.2.2.经典开源软件案例 1.3.关于开源协议 1.3.1.如何选择开源协议 2.如何查找开源项目 2 ...

  9. 几篇关于RGBD语义分割文章的总结

      最近在调研3D算法方面的工作,整理了几篇多视角学习的文章.还没调研完,先写个大概.   基于RGBD的语义分割的工作重点主要集中在如何将RGB信息和Depth信息融合,主要分为三类:省略. 目录 ...

  10. Java预科:DOS命令及电脑快捷键

    Java预科:DOS命令及电脑快捷键 1.快捷键 常用快捷键 a/t +f4关闭窗口 cmd窗口打开快捷方式 1.开始+系统+命令提示符 2.win+r 输入cmd 3.在任意文件夹下面,按住shif ...