package test;
import dao.Person;
import dao.WorkingPerson;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @author 夏雨晨
* @ClassName ReflectDemo
* @Description TODO 反射获取对象的成员变量、成员方法、构造方法并使用
* @date 2021/6/23 17:14
* @Version 1.0
*/
public class ReflectDemo {
private static final Class personObj = Person.class;
private static final Class workingPersonObj = WorkingPerson.class;
public static void main(String[] args) throws Exception {
/**
* Java反射思想要点 万物皆对象
*
* 任意类 是 Class.java类的对象
* 任意字段 是 Field.java类的对象
* 任意方法 是 Method.java类的对象
* 任意构造器 是 Constructor.java类的对象
*/
initClass();
// getField(personObj);
// getMethod(personObj);
// getConstructorA(personObj);
}
/**
* jdk.8文档解释:
* @methodName getConstructor(类<?>... parameterTypes)
* @methodDescription TODO 返回一个 Constructor对象,该对象反映 Constructor对象表示的类的指定的公共 类函数。
* @methodName getConstructors()
* @methodDescription TODO 返回包含一个数组 Constructor对象反射由此表示的类的所有公共构造 类对象。
* @methodName getDeclaredConstructor(类<?>... parameterTypes)
* @methodDescription TODO 返回一个 Constructor对象,该对象反映 Constructor对象表示的类或接口的指定 类函数。
* @methodName getDeclaredConstructors()
* @methodDescription TODO 返回一个反映 Constructor对象表示的类声明的所有 Constructor对象的数组 类 。
*/
private static void getConstructorA(Class personObj) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//抛出找不到方法异常、权限等异常
Object o = personObj.getConstructor().newInstance();
System.out.println("=========== getConstructor ===========");
/**
* getConstructor 返回某个public构造器
*/
Constructor constructor = personObj.getConstructor();
System.out.println(constructor);
System.out.println("=========== getConstructors ===========");
/**
* getConstructors 返回所有public构造器
*/
Constructor[] constructors = personObj.getConstructors();
System.out.println(constructors);
System.out.println("=========== getDeclaredConstructor ===========");
/**
* getDeclaredConstructor 忽略修饰符返回某个构造器
*/
Constructor declaredConstructor = personObj.getDeclaredConstructor(String.class);
declaredConstructor.setAccessible(true);
Person mac = (Person)declaredConstructor.newInstance("马超");
System.out.println(mac.getName());
System.out.println("=========== getDeclaredConstructors ===========");
/**
* getDeclaredConstructors 忽略修饰符返回所有构造器
*/
Constructor[] declaredConstructors = personObj.getDeclaredConstructors();
for (Constructor declaredConstructorI : declaredConstructors) {
System.out.println(declaredConstructorI);
}
}
/**
* jdk.8文档解释:
* @methodName getMethod(String name, 类<?>... parameterTypes)
* @methodDescription TODO 返回一个 方法对象,它反映此表示的类或接口的指定公共成员方法 类对象。
* @methodName getMethods()
* @methodDescription TODO 返回包含一个数组 方法对象反射由此表示的类或接口的所有公共方法 类对象,包括那些由类或接口和那些从超类和超接口继承的声明。
* @methodName getDeclaredMethod(String name, 类<?>... parameterTypes)
* @methodDescription TODO 返回一个 方法对象,它反映此表示的类或接口的指定声明的方法 类对象。
* @methodName getDeclaredMethods()
* @methodDescription TODO 返回包含一个数组 方法对象反射的类或接口的所有声明的方法,通过此表示 类对象,包括公共,保护,默认(包)访问和私有方法,但不包括继承的方法。
*/
private static void getMethod(Class personObj) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Person mrXia = new Person("夏雨晨", 24);
System.out.println("=========== getMethod ===========");
/**
* getMethod 返回某个public方法
*/
//抛出找不到方法异常
Method face = personObj.getMethod("say");
//抛出访问权限异常
face.invoke(mrXia);
System.out.println("=========== getMethods ===========");
/**
* getMethods 返回所有public方法
*/
Method[] methods = personObj.getMethods();
for (Method method : methods) {
System.out.println(method);
}
System.out.println("=========== getDeclaredMethod ===========");
/**
* getDeclaredMethod 忽略修饰符返回某个方法
*/
Method love = personObj.getDeclaredMethod("love",String.class);
love.setAccessible(true);
love.invoke(mrXia,"陈拢");
System.out.println("=========== getDeclaredMethods ===========");
/**
* getDeclaredMethods 忽略修饰符返回所有方法
*/
Method[] declaredMethods = personObj.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod);
}
}
/**
* jdk.8文档解释:
* @methodName getField(String name)
* @methodDescription TODO 返回一个 Field对象,它反映此表示的类或接口的指定公共成员字段 类对象。
* @methodName getFields():
* @methodDescription TODO 返回包含一个数组 Field对象反射由此表示的类或接口的所有可访问的公共字段 类对象。
* @methodName getDeclaredField(String name)
* @methodDescription TODO 返回一个 Field对象,它反映此表示的类或接口的指定已声明字段 类对象。
* @methodName getDeclaredFields()
* @methodDescription TODO 返回的数组 Field对象反映此表示的类或接口声明的所有字段 类对象。
*/
private static void getField(Class personObj) throws NoSuchFieldException, IllegalAccessException {
Person mrZhao = new Person("赵师傅", 23);
System.out.println("=========== getField ===========");
/**
* getFeild 获取单个的public字段
*/
//抛出有可能找不到字段异常 NoSuchFieldException
Field name = personObj.getField("name");
name.set(mrZhao,"打完王者连跪的赵师傅");
//熬出有可能没有权限访问异常 NoSuchFieldException
System.out.println(name.get(mrZhao));
System.out.println("=========== getFields ===========");
/**
* getFields 获取多个public字段
*/
Field[] fields = personObj.getFields();
for (Field field : fields) {
System.out.println(field.get(mrZhao));
}
System.out.println("=========== getDeclaredField ===========");
/**
* getDeclaredField 忽略修饰符返回一个字段
*/
Field age = personObj.getDeclaredField("age");
age.setAccessible(true);
System.out.println(age.get(mrZhao));
System.out.println("=========== getDeclaredFields ===========");
/**
* getDeclaredFields 忽略修饰符返回所有字段
*/
Field[] declaredField
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zip
资源推荐
资源详情
资源评论
收起资源包目录
java反射机制.zip (26个子文件)
java-reflection-demo-master
src
main
resources
pro.properties 43B
java
dao
WorkingPerson.java 1KB
Person.java 1021B
test
ReflectDemo.java 9KB
BasicDemo.java 548B
ReflectTest.java 2KB
.idea
uiDesigner.xml 9KB
misc.xml 273B
vcs.xml 180B
modules.xml 280B
encodings.xml 238B
.gitignore 176B
java-reflection-demo.iml 555B
out
production
askDemo
dao
WorkingPerson.class 2KB
Person.class 2KB
test
ReflectTest.class 3KB
BasicDemo.class 792B
ReflectDemo.class 5KB
pro.properties 43B
reflect-demo
dao
WorkingPerson.class 2KB
Person.class 2KB
test
ReflectTest.class 3KB
BasicDemo.class 792B
ReflectDemo.class 5KB
pro.properties 43B
.gitignore 640B
共 26 条
- 1
资源评论
不安分的小女孩
- 粉丝: 9206
- 资源: 1990
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- mybatis动态sql及其JAVA示例
- 微软常用运行库 游戏运行库 VC++各个版本
- 微信小程序开发教程.pptx
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- 锐捷网络认证中心网络管理.pdf
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- SD8233LF是一款用于单按键触摸及接近感应开关,其用途是替代传统的机械型开关芯片IC
- 基于YOLOv5的烟雾火焰检测算法研究
- 基于STM32的联合调试侦听设备解决方案原理图PCB源文件调试工具视频(大赛作品)
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功