JAVA 中的反射(reflact)
获取反射加载类(获取类的字节码)的3种方式:
- Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
- Class class2 =new Person().getClass();
- Class class3=Person.class;
在JAVA中,解剖类Class提供的常用方法:
- public Constructor<T> getConstructor(Class<?>... parameterTypes) 获取public类型构造函数
- public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取private类型构造函数
例:
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
Constructor c= class1.getDeclaredConstructor(String.class);
c.setAccessible(true); //暴力破解
c.newInstance("张三");
- public Method getMethod(String name, Class<?>... parameterTypes) 获取类的public类型方法
- public Method getDeclaredMethod(String name, Class<?>... parameterTypes) 获取类的private类型方法
例:
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
Person p=(Person)class1.newInstance();
Method method= class1.getDeclaredMethod("Head", String.class);
method.setAccessible(true);//打开访问权限
method.invoke(p, "李四");
获取静态方法并执行:
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
//Person p=(Person)class1.newInstance();
Method method= class1.getMethod("Head", Integer.class);
method.invoke(null, "李四");
注意:反射调用参数为数组时,反射会进行拆解。例:
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
//Person p=(Person)class1.newInstance();
Method method= class1.getMethod("main", String[].class);
method.invoke(null, (Object)new String[] {"12"});
//此处需要做参数包装,不做包装,反射会进行拆解数组参数,最终为:main(String s1),
//与期望main(String [] args) 不相同
- public Field getField(String name) 获取类public类型字段方法。
例:
@Test
public void func7() {
try {
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
Person p=(Person) class1.newInstance();
Field name=class1.getField("name");
//设置字段值:
name.set(p, "张飞");
//读取值
Object object=name.get(p);
//获取字段类型
Class type=name.getType();
if(type.equals(String.class)) {
String vString=(String) object;
System.out.println(vString);
}
//2 .
System.out.println(p.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
- public Field getDeclaredField(String name) 获取private 字段方法。
例:
@Test
public void func8() {
try {
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
Person p=(Person) class1.newInstance();
Field name=class1.getDeclaredField("age");
name.setAccessible(true);
//设置字段值:
name.set(p, 12);
//读取值
Object object=name.get(p);
//获取字段类型
Class type=name.getType();
if(type.equals(String.class)) {
String vString=(String) object;
System.out.println(vString);
}
//2 .
System.out.println(p.getAge());
} catch (Exception e) {
e.printStackTrace();
}
}
JAVA 中的反射(reflact)的更多相关文章
- Java中的反射和注解
前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- 浅说Java中的反射机制(一)
在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...
- java中动态反射
java中动态反射能达到的效果和python的语法糖很像,能够截获方法的实现,在真实方法调用之前和之后进行修改,甚至能够用自己的实现进行特别的替代,也可以用其实现面向切片的部分功能.动态代理可以方便实 ...
- 第89节:Java中的反射技术
第89节:Java中的反射技术 反射技术是动态的获取指定的类,和动态的调用类中的内容(没有类前就可以创建对象,将对象的动作完成,这就是动态的获取指定的类). 配置文件把具体实现的类名称定义到配置文件中 ...
- java笔记十:java中的反射
Java中,反射是一种强大的工具.它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接.反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而 ...
- 【Java基础】java中的反射机制与动态代理
一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...
- java中使用反射获取pojo(实体)类的全部字段值
说起反射.不得不说它实在是太强大了,通过反射就能够轻轻松松拿到各种东东,假设你想在项目中解除对某个类的依赖,能够考虑用反射. 今天跟大家分享的是通过java中的反射,获取pojo类的全部字段值. 为什 ...
- java 中利用反射机制获取和设置实体类的属性值
摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...
随机推荐
- Flink(五) —— DataStream API
Source 从自定义的集合中读取数据 /** * 从集合中读取数据 */ def readDataFromCollection(): Unit = { val env = StreamExecuti ...
- 面向VBA一维数组的实用自定义函数
UDF.dll包含了一组实用的用户自定义函数,提供了数组处理的快速方法,可以在VB6.VBS.32位VBA中调用. 看完如下的实例代码,就明白它的用处了. Private MyUDF As New U ...
- Hibernate工程的手动创建
1.打开MyEclipse软件,新建Java项目,如HibernateReview: 2.导入Hibernate所需的jar包: 右键build path选择configurate build pat ...
- linux下常用命令查看端口占用
在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询netstat命令各个参数说明如下: -t : 指明显示TCP端口 ...
- 跨域问题与SpringBoot解决方案
什么是跨域? 定义:浏览器从一个域名的网页取请求另一个域名下的东西.通俗点说,浏览器直接从A域访问B域中的资源是不被允许的,如果想要访问,就需要进行一步操作,这操作就叫"跨域".例 ...
- djangp-filter的使用
目录 Filter定义 Filter定义 定义如下Filter类 class BookFilter(django_filters.FilterSet): name = django_filters.C ...
- mysql查找json格式列的指定字段值
SELECT json_extract(字段名,'$.json结构') FROM 表名;如果json里有双引号,那这样取出来的数据也带双引号,要去掉就使用REPLACE函数 例如t_submit_an ...
- 60)PHP,项目执行过程总结
- Win7如何查看nvidia显卡(GPU)的利用率
1.在文件夹C:\Program Files\NVIDIA Corporation\NVSMI里找到文件nvidia-smi.exe2.把该文件拖到命令提示符窗口(win+R,再输入‘CMD’进入), ...
- RPC 框架性能大比拼
Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成. Motan 是新浪微博开源的一个Java ...