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. 还在本地安装MySQL/RabbitMQ/MongoDB 吗 ? 或许你可以试试这个【附下载】

    我们经常在Windows开发的时候,需要在本地进行调试.当然也免不了安装数据库.消息队列 等一些开发软件.等什么时候我们重新安装了这边软件.如此的繁琐. 尤其是安装RabbitMQ 消息队列的时候,居 ...

  2. C#数据结构-线程安全队列

    什么是线程安全? 答:线程安全是多线程编程时的计算机程序代码中的一个概念.在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意 ...

  3. httpx和requests之间有什么区别?

    requests只能发送同步请求,httpx能够发送同步和异步请求. httpx的api和requests是兼容的,切换的成本几乎是零.在异步模式下,测试大量接口的话,httpx的速度是能够显著得到提 ...

  4. Java学习的第三十九天

    1.例3.7 100~200之间全部素数 package bgio; public class cjava { public static void main(String[]args) { int ...

  5. 2020 校招,我是如何拿到小米、京东、字节大厂前端offer

    前言 Hi~,我是 2020 届物联网专业毕业生,现就读于杭州.谨以此文来记录我的秋招以及入门前端以来的学习历程,如有错误,希望大家能及时提出! 面试情况 从19年8月初到11月底,前前后后一共面试了 ...

  6. 专业之旅——GitHub 热点速览 Vol.45

    作者:HelloGitHub-小鱼干 从入门到精通需要什么?AI-Expert-Roadmap 带你开启专业之旅,和 135k+ 高星项目 developer-roadmap 一样, AI-Exper ...

  7. # Maven:Could not transfer artifact org.springframework:spring-webmvc:pom:。。。(系统找不到文件),从网上clone到本地的项目报红

    解决办法: 确保maven配置正确,在maven的setting.xml配置文件中, 配置本地仓库路径 <localRepository>D:\Maven\文件名</localRep ...

  8. 高清DEM最高立减1500元!

    选购攻略: 活动一:选购12.5米DEM(地形)数据.30米 DEM(地形)数据,满500元立减100元.满1000元立减200元.满2000立减500元.满5000元立减1500元:每位用户仅可享受 ...

  9. Skip Lists: A Probabilistic Alternative to Balanced Trees 阅读笔记

    论文地址:https://15721.courses.cs.cmu.edu/spring2018/papers/08-oltpindexes1/pugh-skiplists-cacm1990.pdf ...

  10. TCP拥塞控制原理

    一.何为拥塞 路由器无法处理高速到达的数据而被迫丢弃数据的现象叫做拥塞. 二.何为拥塞控制 TCP流量控制时为了平衡一个链接中接收方和发送方的速度匹配问题,当发送方发现发送速度大于接收方的接收速度时动 ...