Java反射机制

Java反射机制是Java语言的一个重要特性,使得Java语言具备“动态性”:

在运行时获取任意一个对象所属的类的相关信息;

在运行时构造任意一个类的对象;

在运行时获取任意一个类所具有的成员变量和方法;

在运行时调用任意一个对象的方法。

JAVA反射机制是构建框架技术的基础。

例如后续学习的Spring框架等,都使用到反射技术;

Java的反射机制依靠反射API实现,反射API主要包括以下几个类,后续学习:

java.lang.Class类:代表一个类;

java.lang.reflect.Field 类:类的成员变量(成员变量也称为类的属性);

java.lang.reflect.Method类:类的方法;

java.lang.reflect.Constructor 类:类的构造方法;

java.lang.reflect.Array类:动态创建数组,以及访问数组的元素的静态方法。

通过Class实例化对象

_class.newInstance()

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationTargetException;

public class T31反射创建对象 {

public static void main(String[] args) throws ClassNotFoundException, InstantiationException,

IllegalAccessException, NoSuchMethodException, SecurityException,

IllegalArgumentException, InvocationTargetException {

Class> _class = Class.forName("java.lang.String");

// 1.直接创建对象

Object newInstance = _class.newInstance();

// 说明创建了一个空字符串:""

System.out.println(newInstance.equals(""));

// 2.通过获取构造方法,构造对象

Constructor> _constr = _class.getConstructor(_class);

Object _obj = _constr.newInstance("实例化对象");

System.out.println(_obj);

}

}

true

实例化对象

私有成员也能获取

包括:构造,变量,方法

getDeclaredXXX可以获取私有成员

package ahjava.p07reflect;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

public class T32获取私有成员一览 {

public static void main(String[] args) throws Exception {

// get构造方法();

// getMethod();

getField();

}

static void get构造方法() {

Class _class = Dog.class;

Constructor[] _ctors = null;

System.out.println("---↓↓↓getConstructors()获取public构造方法");

_ctors = _class.getConstructors();

for (Constructor c : _ctors) {

System.out.println(c);

}

System.out.println("---↓↓↓getDeclaredConstructors()获取全部构造方法");

_ctors = _class.getDeclaredConstructors();

for (Constructor c : _ctors) {

System.out.println(c);

}

}

static void getMethod() throws NoSuchMethodException, SecurityException {

Class _class = Dog.class;

Method[] mtds;

System.out.println("===↓↓↓.getMethods()所有public方法,包括继承来的方法=====");

mtds = _class.getMethods();

for (Method md : mtds) {

System.out.println(md);

}

System.out.println("===↓↓↓.getDeclaredMethods()所有自己声明的方法=====");

mtds = _class.getDeclaredMethods();

for (Method md : mtds) {

System.out.println(md);

}

System.out.println("=====获取指定方法=====");

System.out.println("-----.getMethod()只能获取public方法");

System.out.println("-----.getDeclaredMethod()可获取private方法");

// (方法名,参数类型...)

Method m = _class.getDeclaredMethod("_someMethod", String.class);

System.out.println(m);

}

static void getField()

throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {

Class _class = Dog.class;

Field[] fields;

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

fields = _class.getFields();

for (Field fd : fields) {

System.out.println(fd);

}

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

fields = _class.getDeclaredFields();

for (Field fd : fields) {

System.out.println(fd);

}

System.out.println("=====获取指定变量=====");

System.out.println("-----.getDeclaredField(...)");

Field f = _class.getDeclaredField("fPrivate");

System.out.println(f);

}

}

class Dog {

private Dog() {

System.out.println("private构造方法");

}

public Dog(String name) {

System.out.println("public构造方法");

}

public Dog(String name, int n) {

System.out.println("public构造方法");

}

// -----变量-----

private String fPrivate = "private变量";

protected String fProtected = "protected变量";

public String fPublic = "public变量";

String fDefault = "未修饰变量";

// -----方法-----

private void _mPrivate() {

}

protected void _mProtected() {

}

public void _mPublic() {

}

void _mDefault() {

}

// ---

private void _someMethod(String s) {

}

}

=====.getFields()=====

public java.lang.String ahjava.p07reflect.Dog.fPublic

=====.getDeclaredFields()=====

private java.lang.String ahjava.p07reflect.Dog.fPrivate

protected java.lang.String ahjava.p07reflect.Dog.fProtected

public java.lang.String ahjava.p07reflect.Dog.fPublic

java.lang.String ahjava.p07reflect.Dog.fDefault

=====获取指定变量=====

-----.getDeclaredField(...)

private java.lang.String ahjava.p07reflect.Dog.fPrivate

获取私有成员应用:

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

public class T33获取私有成员应用 {

public static void main(String[] args) throws Exception {

Class _class = Dog2.class;

// 获取(私有)构造方法

Constructor _constr = _class.getDeclaredConstructor();

_constr.setAccessible(true);

Object _obj = _constr.newInstance();

// 获取(私有)成员变量

Field _field = _class.getDeclaredField("name");

_field.setAccessible(true);

System.out.println("原内容:" + _field.get(_obj));

_field.set(_obj, "二狗");

// 获取(私有)方法(方法名,参数类型列表)

Method m = _class.getDeclaredMethod("show", String.class, int.class);

m.setAccessible(true);

// __invoke:调用对象obj的当前方法,args为方法参数;

m.invoke(_obj, "狗", 2);

}

}

class Dog2 {

private Dog2() {

System.out.println("私有构造方法");

}

private String name = "SS";

private void show(String str1, int n2) {

System.out.println(name + ":'汪汪'" + str1 + n2);

}

}

私有构造方法

原内容:SS

二狗:'汪汪'狗2

java 反射教程_Java基础教程——反射机制相关推荐

  1. 黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三)

    黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三) 1.1 异常概述与异常体系结构 1.2 JVM遇到异常时的默认处理方案 1.3 异常处理 1.4 异常处理之try--catch ...

  2. 反射 数据类型_Java基础:反射机制详解

    一.什么是反射: (1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法.本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取t对 ...

  3. java 反射泛型方法_java基础之反射和泛型以及注解

    java基础之反射和泛型以及注解 泛型擦除 泛型擦除: 泛型只在编译时期有效,编译后的字节码文件中不存在泛型信息. 声明泛型集合,集合两端类型必须一致.类型也可以用包装类型,泛型的类型必须是引用类型, ...

  4. java display.getdefault()_java基础(十一 )-----反射——Java高级开发必须懂的

    本文我们通过一个实际的例子来演示反射在编程中的应用,可能之前大家对反射的学习,仅仅是停留在概念层面,不知道反射究竟应用在哪,所以是一头雾水.相信通过这篇教程,会让你对反射有一个更深层次的认知. 概念 ...

  5. java io流 教程_Java基础教程:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:指的是从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列 ...

  6. java多线程教程_java 基础教程之多线程详解及简单实例

    java 多线程详解 在这篇文章里,我们关注多线程.多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性.如何创建线程.线程的状态切换以及线程通信. 线程是操作系统运行的基本单位,它 ...

  7. java数据成员_Java基础教程之对象的方法与数据成员

    在Java基础教程之从Hello World到面向对象一文中,我们初步了解了对象(object).对象中的数据成员表示对象的状态.对象可以执行方法,表示特定的动作. 此外,我们还了解了类(class) ...

  8. hkt java 怎么转换_Java基础教程——转换流

    转换流 通常,Window默认的编码方式是GBK,Java项目一般建议设为UTF-8编码.这时候读取文件可能出现乱码.事实上实际应用中编码格式不匹配的场景非常多. 转换流可以指定编码方式,用于解决乱码 ...

  9. java jdk使用教程_Java基础教程——安装JDK

    使用[jdk-8u144-windows-x64.exe] 下载地址: 安装后测试:打开cmd,输入[java -version] C:\Users\Administrator>java -ve ...

最新文章

  1. java web教学大纲_《JAVAWEB程序设计》教学大纲.pdf
  2. 完全卸载sql2005(试了以后很成功,收录下来,分享给大家)
  3. 工具 每分钟_black: 一个不妥协的Python代码格式化工具
  4. 阿里云NAS备份服务
  5. elinks文字浏览器
  6. Centos YUM国内163源
  7. SpringMVC之@RequestMapping注解及其衍生注解详解
  8. 单片机shell命令_单片机裸机下写一个自己的shell调试器
  9. 汉子拼音不认识缤纷_儿童学拼音app哪个最好
  10. 分治法求最大和最小值
  11. (转)DPDK内存管理 01 -----初始化
  12. STM32芯片命名规则及含义
  13. 利用word2vec创建中文主题词典——以网络暴力关键词为例
  14. python百度经纬度转google经纬度
  15. on与where的区别
  16. Python 实现微信测试号情侣纪念消息推送(消息群发)
  17. python长度单位换算用def_计算字段示范
  18. error: unable to unlink old 'antzb-web/src/main/webapp/js/ny-details.js': Invalid argument
  19. [转载]scanf()函数释疑[作者]------knocker
  20. Android常用知识点总汇

热门文章

  1. 【网络安全】如何在 Apache 安装开源 WAF
  2. 想知道Amazon在德国缴多少税吗?
  3. Facebook Paper使用的第三方库
  4. Winform仿制QQ微信聊天窗口气泡
  5. 荣之学分析丨社交与跨境电商的结合是跨境电商未来发展的趋势?
  6. 程序员如何维护自己?
  7. 一本好书《目标:简单而有效的常识管理》
  8. 64位系统控件注册方法
  9. 2021年安全员-A证(江苏省)考试题及安全员-A证(江苏省)考试报名
  10. 关于seleniumThis version of ChromeDriver only supports Chrome version 99镜像版本报错解决