java 反射教程_Java基础教程——反射机制
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基础教程——反射机制相关推荐
- 黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三)
黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三) 1.1 异常概述与异常体系结构 1.2 JVM遇到异常时的默认处理方案 1.3 异常处理 1.4 异常处理之try--catch ...
- 反射 数据类型_Java基础:反射机制详解
一.什么是反射: (1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法.本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取t对 ...
- java 反射泛型方法_java基础之反射和泛型以及注解
java基础之反射和泛型以及注解 泛型擦除 泛型擦除: 泛型只在编译时期有效,编译后的字节码文件中不存在泛型信息. 声明泛型集合,集合两端类型必须一致.类型也可以用包装类型,泛型的类型必须是引用类型, ...
- java display.getdefault()_java基础(十一 )-----反射——Java高级开发必须懂的
本文我们通过一个实际的例子来演示反射在编程中的应用,可能之前大家对反射的学习,仅仅是停留在概念层面,不知道反射究竟应用在哪,所以是一头雾水.相信通过这篇教程,会让你对反射有一个更深层次的认知. 概念 ...
- java io流 教程_Java基础教程:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:指的是从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列 ...
- java多线程教程_java 基础教程之多线程详解及简单实例
java 多线程详解 在这篇文章里,我们关注多线程.多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性.如何创建线程.线程的状态切换以及线程通信. 线程是操作系统运行的基本单位,它 ...
- java数据成员_Java基础教程之对象的方法与数据成员
在Java基础教程之从Hello World到面向对象一文中,我们初步了解了对象(object).对象中的数据成员表示对象的状态.对象可以执行方法,表示特定的动作. 此外,我们还了解了类(class) ...
- hkt java 怎么转换_Java基础教程——转换流
转换流 通常,Window默认的编码方式是GBK,Java项目一般建议设为UTF-8编码.这时候读取文件可能出现乱码.事实上实际应用中编码格式不匹配的场景非常多. 转换流可以指定编码方式,用于解决乱码 ...
- java jdk使用教程_Java基础教程——安装JDK
使用[jdk-8u144-windows-x64.exe] 下载地址: 安装后测试:打开cmd,输入[java -version] C:\Users\Administrator>java -ve ...
最新文章
- java web教学大纲_《JAVAWEB程序设计》教学大纲.pdf
- 完全卸载sql2005(试了以后很成功,收录下来,分享给大家)
- 工具 每分钟_black: 一个不妥协的Python代码格式化工具
- 阿里云NAS备份服务
- elinks文字浏览器
- Centos YUM国内163源
- SpringMVC之@RequestMapping注解及其衍生注解详解
- 单片机shell命令_单片机裸机下写一个自己的shell调试器
- 汉子拼音不认识缤纷_儿童学拼音app哪个最好
- 分治法求最大和最小值
- (转)DPDK内存管理 01 -----初始化
- STM32芯片命名规则及含义
- 利用word2vec创建中文主题词典——以网络暴力关键词为例
- python百度经纬度转google经纬度
- on与where的区别
- Python 实现微信测试号情侣纪念消息推送(消息群发)
- python长度单位换算用def_计算字段示范
- error: unable to unlink old 'antzb-web/src/main/webapp/js/ny-details.js': Invalid argument
- [转载]scanf()函数释疑[作者]------knocker
- Android常用知识点总汇