Java基础教程:反射基础

引入反射

反射是什么

能够动态分析类能力的程序称为反射。反射是一种很强大且复杂的机制。

Class类

在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的类型标识。这个对象追踪着每个对象所属的类。虚拟机利用运行时类的信息选择相应的方法执行。

我们可以通过专门的Java类访问这些信息。保存这些信息的类称为Class。

直接获取

Class cl1 =Date.class;

Class cl2 = Integer.class;

根据对象获得类信息

MyClass myClass;

.....

Class cl = myClass.getClass();

cl.getName(); //获得类名

调用静态方法forName获得类名相应的Class对象。

String className = 'java.util.Date';

Class cl = Class.forName(className);

注意:

虚拟机为每一个类型管理一个Class对象。因此使用==可以实现两个类对象比较的操作。

利用反射分析类的能力

API函数举例

getDeclaredFields():获得此类对象所表示的类或接口所声明的所有字段。

getFields():输出类以及其所继承的父类的 public 字段

getDeclaredMethods():获得此类对象所表示的类或接口所声明的所有方法,包括公共、保护、私有但不包括继承。

getDeclaredConstructors() :返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。

getName():获得此class所表示实体的名称。

示例:输出字段

GetFields只会输出publicStr,GetDeclaredFields则会忽略访问控制符输出所有字段!

public class MyClass{

public String publicStr;

private String privateStr;

protected String protectedStr;

public static void main(String[] args) {

//获取Class类

Class c1 = MyClass.class;

//调用GetFields()

for(Field field : c1.getFields()){

System.out.println(field.getName());

}

System.out.println("=============");

//调用GetDeclaredFields()

for(Field field : c1.getDeclaredFields()){

System.out.println(field.getName());

}

}

}

示例:输出方法

getDeclaredMethods只会输出本类的所有方法!

public class MyClass{

public void publicFun(int a){}

private void privateFun(int a){}

protected void protectFun(int a){}

public static void main(String[] args) {

//获取Class类

Class c1 = MyClass.class;

//2.1 获取所有 public 访问权限的方法

//包括自己声明和从父类继承的

//Method[] mMethods = c1.getMethods();

//2.2 获取所有本类的的方法(不问访问权限)

Method[] mMethods = c1.getDeclaredMethods();

//3.遍历所有方法

for (Method method :

mMethods) {

//获取并输出方法的访问权限(Modifiers:修饰符)

int modifiers = method.getModifiers();

System.out.print(Modifier.toString(modifiers) + " ");

//获取并输出方法的返回值类型

Class returnType = method.getReturnType();

System.out.print(returnType.getName() + " "

+ method.getName() + "( ");

//获取并输出方法的所有参数

Parameter[] parameters = method.getParameters();

for (Parameter parameter :

parameters) {

System.out.print(parameter.getType().getName()

+ " " + parameter.getName() + ",");

}

//获取并输出方法抛出的异常

Class[] exceptionTypes = method.getExceptionTypes();

if (exceptionTypes.length == 0) {

System.out.println(" )");

} else {

for (Class c : exceptionTypes) {

System.out.println(" ) throws "

+ c.getName());

}

}

}

}

}

调用getDeclaredMethods输出结果:

public static void main( [Ljava.lang.String; arg0, )

protected void protectFun( int arg0, )

private void privateFun( int arg0, )

public void publicFun( int arg0, )

调用getMethods输出结果:

public static void main( [Ljava.lang.String; arg0, )

public void publicFun( int arg0, )

public final void wait( ) throws java.lang.InterruptedException

public final void wait( long arg0,int arg1, ) throws java.lang.InterruptedException

public final native void wait( long arg0, ) throws java.lang.InterruptedException

public boolean equals( java.lang.Object arg0, )

public java.lang.String toString( )

public native int hashCode( )

public final native java.lang.Class getClass( )

public final native void notify( )

public final native void notifyAll( )

在运行时使用反射分析对象

API函数举例

setAccessible(boolean flag):为反射对象设置可访问标志。为true使得对象的私有属性也可以被查询和设置。

getField(): 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

get(Object obj):返回对象中用Field对象表示的域值。

set(Object obj,Object newValue):用一个新值设置Obj对象中的Field对象表示的域。

示例:获取并设置对象的私有字段值

public class MyClass{

private String context = "Hello World";

public static void main(String[] args) {

//获取Class类

Class c1 = MyClass.class;

try {

//构建对象

Object myClass = c1.newInstance();

//获取私有变量

Field context = c1.getDeclaredField("context");

//获取私有变量访问权

context.setAccessible(true);

//访问私有变量值

System.out.println(context.get(myClass));

//设置私有变量值

context.set(myClass, "Hi Boy!");

System.out.println(context.get(myClass));

} catch (Exception e) {

e.printStackTrace();

}

}

}

利用反射调用任意方法

API函数说明

public Object invoke(Object obj,Object... args)

参数:obj - 从中调用底层方法的对象args - 用于方法调用的参数

返回:使用参数 args 在 obj 上指派该对象所表示方法的结果

示例:调用私有方法

public class NCConfgCliService {

private void privateFun(int a){

System.out.println(a);

}

public static void main(String[] args) {

//获取Class类

Class c1 = NCConfgCliService.class;

try {

//获取私有方法

Method privateMethod = c1.getDeclaredMethod("privateFun",int.class);

//创建类的实例

Object obj = c1.newInstance();

//调用私有方法

privateMethod.invoke(obj,10);

} catch (Exception e) {

e.printStackTrace();

}

}

}

java 反射基础_Java基础教程:反射基础相关推荐

  1. sql数据库教程百度云_【推荐】零基础水彩画入门教程|零基础水彩教程百度云...

    零基础水彩画入门教程|零基础水彩教程百度云! 照着教程画却总是画不好,这些水彩技法你真的学会了吗? 盲目地照着葫芦画瓢,不懂控制确实很难学会,可以关注一下公众号:每日学绘画,可以领取水彩电子书和全套视 ...

  2. matlab基础与实例教程,MATLAB基础与实例教程

    系统全面,实例丰富 考虑到Matlab进行仿真和运算分析时的基础知识和实践操作,讲解从基础的变量.函数.数据类型等入手,涉及到数学分析.图形可视化.Simulink仿真.文件读写等,全面地介绍了Mat ...

  3. 计算机网络基础及应用教程,计算机网络基础及应用教程

    摘要: <高等学校文科类专业"十一五"计算机规划教材:计算机网络基础及应用教程>为教育部高校文科计算机教学指导委员会的课程改革立项教材,其特色是以计算机网络技术应用能力 ...

  4. java泛型怎么用反射生成_Java 之 使用反射生成并操作对象

    一.使用反射创建对象 通过反射来生成对象有如下两种方式: 方式一: 使用 Class 对象的 newInstance() 方法来创建 Class 对象对应类的实例,这种方法要求该 Class 对象的对 ...

  5. java捕鱼设计_JAVA毕业设计教程:用swing实现捕鱼达人代码教程

    用JAVA SWING实现的捕鱼教程 开发工具:ECLIPSE 实现技术:JAVA SWING 用到的JAR包:xmlpull_1_1_3_4c.jar.dom4j-1.6.1.jar.jl1.0.j ...

  6. java中sping基础_Java回顾之Spring基础

    这一篇主要讲Spring一些基础的内容. 概述 Spring 是一个非常火的框架,尤其是在Web开发领域,和Struts以及Hibernate构成了SSH三剑客.当时Web开发的另一个组合是LAMP, ...

  7. java多线程面试_Java多线程和并发基础面试问答,看过后你不会后悔

    ***:Java多线程面试问题 1:进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java ...

  8. java遍历字符串_Java后端开发算法基础面试题分享,你离大厂也许就差这份面试题

    一.算法基础 1. 重建二叉树 题目: 输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树. 注意: 二叉树中每个节点的值都互不相同: 输入的前序遍历和中序遍历一定合法: 演示: 给定: 前序遍历 ...

  9. java负零_java数据结构从零基础到负基础

    第一章 基础 1.3.32 栈与队列融合的数据结构:链表实现 1.接口public interface ISteque { /** * 进栈 * @param val 进栈元素 */ void pus ...

  10. java session使用_java学习之web基础(8):使用session实现带验证码的登录功能

    login.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> ...

最新文章

  1. python使用笔记:sys.argv[]的使用
  2. kubernetes环境下私有仓库搭建
  3. 成功解决from scipy.linalg import _fblas ImportError: DLL load failed: 找不到指定的模块。
  4. C语言再学习 -- 位、字节、字、字长、字元的关系
  5. OpenGL创建窗口
  6. 畅通工程,How Many Tables ACM第九天-图论
  7. 字符串中最后一个单词长度
  8. 系列(七)—测试用例设计
  9. 关于jHipster框架在构建中的出现的error修复
  10. leetcode面试题 02.08. 环路检测
  11. 谷歌 Provisional headers are shown 和360急速模式 网络连接错误
  12. CCF201703-3 Markdown(100分)【文本处理】
  13. Pytorch——神经网络工具箱nn
  14. Python机器学习库sklearn自动特征选择(训练集)
  15. hrbust 哈理工oj 网线【MST+Prim】
  16. 最新emoji表情代码大全_8张最新创意好看的早上好表情图片大全 秋日温馨的早安祝福图片带字精选...
  17. Oracle学习VII —— Oracle建表
  18. matlab中小波去燥原理,用matlab进行小波去噪的程序
  19. java三种功能加强模式
  20. Zookeeper到底是AP还是CP?

热门文章

  1. oracle8i+下载,oracle database 8i, 9i,10g, 11g正确下载地址
  2. python image模块需要安装吗_python Image模块安装
  3. java web 手机验证_JAVA-WEB,好知网,登录注册,手机验证
  4. android 脚本运行命令大全,【Android】Monkey之命令详解
  5. c语言转职,魔兽地图:3C转职版5.0C
  6. ESX/ESXi 主机上的每个插槽中安装了多少内存
  7. Java开发笔记(五十六)利用枚举类型实现高级常量
  8. Bootstrap 图片
  9. 多线程中对全局变量(整型类型)是否需要同步操作
  10. 阿里云构建Jenkins服务