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. scrapy和scrapy-redis 详解一 入门demo及内容解析

    架构及简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. Scrapy 使用了 Twisted(其主要对手是Tornado)异步网络框架来处理 ...

  2. NB-IoT的NPBCH发送过程

    NB-IoT的NPBCH是使用固定的重复样式发送的.NPBCH的传输时间间隔(Transmiss Time Interval,TTI)是640ms,承载NB-IoT主系统消息块(Narrow-Band ...

  3. Java学习的第三十天

    1.遇到打印文件使用打印流PrintStream 使用PrintStream写入数据 2.没有问题 3.明天学习用RandomAccessFile随机访问文件

  4. Android Google官方文档解析之——Device Compatibility

    Android is designed to run on many different types of devices, from phones to tablets and television ...

  5. C++ 设计模式 3:结构型模式

    0 结构型模式 让类和类进行组合,获得更大的结构,获得新功能的方式. 1 代理模式 Proxy 模式又被叫做代理模式,是结构型的设计模式之一,它可以 为其他对象提供一种代理以控制对这个对象的访问. 所 ...

  6. 内网渗透 day4-meterpreter基本命令

    meterpreter基本命令 目录 1.getuid 查看当前用户 1 2.getpid 查看当前的进程id 1 3.getsystem 初步提权 1 4.ps 1.查看进程列表2.帮助我们获取pi ...

  7. 第05组 Alpha冲刺 (2/6)

    .th1 { font-family: 黑体; font-size: 25px; color: rgba(0, 0, 255, 1) } #ka { margin-top: 50px } .aaa11 ...

  8. 关于情感分类(Sentiment Classification)的文献整理

    最近对NLP中情感分类子方向的研究有些兴趣,在此整理下个人阅读的笔记(持续更新中): 1. Thumbs up? Sentiment classification using machine lear ...

  9. css 实现换肤几种方式

    说起换肤功能,前端肯定不陌生,其实就是颜色值的更换,实现方式有很多,也各有优缺点 一.可供选择的换肤 对于只提供几种主题方案,让用户来选择的,一般就简单粗暴的写多套主题 一个全局class控制样式切换 ...

  10. VGA详解及色块碰撞示例

    引言 VGA:video Graphics array,视频图形阵列,阴极射线显像管(CRT)显示器时代产物,很多老显卡.笔记本电脑.投影仪所用接口,已经比较过时. CRT是模拟设备,所以VGA也采用 ...