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<Dog> _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<Dog> _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<Dog> _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<Dog2> _class = Dog2.class;
// 获取(私有)构造方法
Constructor<Dog2> _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基础教程——反射机制的更多相关文章

  1. java基础之反射机制

    一.概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...

  2. java基础篇---反射机制

    一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...

  3. 【Java基础】反射机制

    反射 反射可以使我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码链接.反射允许我们在编写和执行时,使我们的代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类 ...

  4. [ 原创 ] Java基础7--Java反射机制主要提供了以下哪些功能?

    AVA反射机制主要提供了以下哪些功能? 在运行时判断一个对象所属的类 在运行时构造一个类的对象 在运行时判断一个类所具有的成员变量和方法 在运行时调用一个对象的方法

  5. Java基础加强-反射机制

    反射的基石 -> Class 类(字节码)/*只要是在源程序中出现的类型,都要各自的Class实例对象,例如:int,int[],void*/如何得到各个字节码对应的实例对象(Class类型) ...

  6. Java基础教程:反射基础

    Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时 ...

  7. 【Java基础】java中的反射机制与动态代理

    一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...

  8. Java基础教程:注解

    Java基础教程:注解 本篇文章参考的相关资料链接: 维基百科:https://zh.wikipedia.org/wiki/Java%E6%B3%A8%E8%A7%A3 注解基础与高级应用:http: ...

  9. 黑马程序员_Java基础:反射机制(Reflection)总结

    ------- android培训.java培训.期待与您交流! ---------- 反射在java中有非常重大的意义,它是一种动态的相关机制,可以于运行时加载.探知.使用编译期间完全未知的clas ...

随机推荐

  1. Luogu P4208 [JSOI2008]最小生成树计数

    题意 给定一个 \(n\) 个点 \(m\) 条边的图,求最小生成树的个数. \(\texttt{Data Range:}1\leq n\leq 100,1\leq m\leq 10^4\) 题解 一 ...

  2. audioread.NoBackendError

    audioread.NoBackendError 起因 使用以下代码读取音频文件时: # !/usr/bin/python # -*- coding: utf-8 -*- ""&q ...

  3. 关于appium

    一.特点 1.appium是开源的移动端自动化测试框架: 2.appium可以测试原生的.混合的.以及移动端的web项目: "移动原生应用"是指那些用iOS或者 Android S ...

  4. C#实现的几种委托方式介绍

    //普通委托            DeleteShow ds = new DeleteShow(ShowName);            Console.WriteLine("----- ...

  5. 什么是LRU缓存淘汰机制

    LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰.该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历 ...

  6. 使用arm-none-eabi-gdb报错error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory

    使用arm-none-eabi-gdb报错error while loading shared libraries: libncurses.so.5: cannot open shared objec ...

  7. [MIT6.006] 7. Counting Sort, Radix Sort, Lower Bounds for Sorting 基数排序,基数排序,排序下界

    在前6节课讲的排序方法(冒泡排序,归并排序,选择排序,插入排序,快速排序,堆排序,二分搜索树排序和AVL排序)都是属于对比模型(Comparison Model).对比模型的特点如下: 所有输入ite ...

  8. ESP32的Linux开发环境搭建

    1. 官网教程地址 https://docs.espressif.com/projects/esp-idf/zh_CN/v4.0.1/get-started/linux-setup.html 2.官网 ...

  9. 11Linux之软件包管理

    11Linux之软件包管理 目录 11Linux之软件包管理 11 软件包管理 11.1 软件包介绍 11.1.1 编程语言分类 11.1.2 三种安装包 11.2 rpm包管理 11.2.1 rpm ...

  10. ceph的rbd备份软件ceph-backup

    teralytics是一家国外的大数据公司,这个是他们开源的ceph的备份的工具,在twitter上搜索相关信息的时候看到,觉得不错就拿来试用一番 这是个什么软件 一个用来备份 ceph 的 rbd ...