博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反射
阅读量:6622 次
发布时间:2019-06-25

本文共 1953 字,大约阅读时间需要 6 分钟。

hot3.png

目前是jdk1.8,主要结合此进行;

更新于2019-05-06

反射

java提供的自省能力,可以获取类定义,方法,字段,构造器;可以调用方法,构造实例,还可以修改类定义

反射与jigsaw

--illegal-access={ permit | warn | deny } jdk9中设置改参数,可以控制反射访问对应目标包的权限

1. 获取字段

MonthTask monthTask = monthTaskrep.getOne(mainTaskId + 0L);Class
mclass = monthTask.getClass();Field field= mclass.getDeclaredField(name);Object val=field.get(monthTask);

根据实例获取class,然后用class的到field,然后通过field来获取结果,常用Field.get(Class的instance),当然还有其他获取值得方法,如Field.getString(instance),Field.getInteger(instance);

2. 调用方法

Method method =mclass.getDeclaredMethod("getTal" + i + "goal") ;//1Object o= method.invoke(monthTask);//2
  • 1.从class中获取方法对象,mclass.getDeclaredMethod(String methodName,Class<?>... parameterTypes),第二个位置为参数列表; 貌似jdk1.8不支持直接获取private类型的field,然后只能用method去取了;在获取set方法时,结果没写参数列表,所以的到的方法时null;:joy:
  • 2.method.invoke(instance,Object... args);第二位置为该方法参数实例,如 method.invoke(instance,1,"圣斗士",5L);

3. 构造实例

Class
mclass = monthTask.getClass(); MonthTask monthTask= mclass.newInstance();

这个monthTask需要你去赋值;即通过获取各种set方法去赋值;各种javaBean都是通过这种方式构造的; 当然MonthTask类必须符合javaBean的标准; ORM的映射也是通过反射实现的,

4. 获取元数据(注解)

 A getDeclaredAnnotation(Class annotationClass){}Entity entity= mclass.getDeclaredAnnotation(Entity.class);
  • 获取了一个在mclass类上的Entity注解entity的实例,然后通过该entity和mclass在一起将其转化成具体的数据库的table;具体代码缺;

5. 获取实现的接口

Class
classz=new ArrayList
().getClass(); classz=ArrayList.class; Class
[] interfaces= classz.getInterfaces()();for(Class
interface:interfaces){ System.out.println(interface.getName());}
  • 输出会包含 java.lang.List; 因为ArrayList实现了List接口; 可以通过继承的接口来判断该类有什么方法;或者对其进行针对性的操作;

6.修改访问权限

Field world = aClass.getDeclaredField("world");            if(!world.isAccessible()){                world.setAccessible(true);                System.out.println(world.get(this));            }
  • Field,Constructor,Method继承了AccessibleObject类
  • AccessibleObject类定义了访问限权相关的数据和动作;如果没有访问权限,就强制改变访问权限;

在实际操作中,非常方便,但需要慎用

转载于:https://my.oschina.net/u/1590027/blog/678807

你可能感兴趣的文章
VS2012 打包部署程序
查看>>
将 Visual Studio .NET 调试器用于 ASP.NET 应用程序
查看>>
Windows Embedded Standard开发初体验(六)
查看>>
ubuntu samba服务器多用户配置【转】
查看>>
asp.net 正则 例子
查看>>
Ubuntu使用tcpdump工具
查看>>
linux缺页异常处理--用户空间【转】
查看>>
探索 OpenStack 之(8):Neutron 深入探索之 OVS + GRE 之 完整网络流程 篇
查看>>
Hadoop HDFS编程 API入门系列之HdfsUtil版本2(七)
查看>>
Silverlight实用窍门系列:30.Silverlight中创建一个最简单的WCF RIA Services访问数据库实例【实例源码+数据库下载】...
查看>>
冗余带来的麻烦
查看>>
POJ1789 Truck History【最小生成树】【终于AC了】
查看>>
Dojo入门:dojo中的事件处理
查看>>
C# 泛型编程?
查看>>
让Dictionary key 支持自定义对象
查看>>
Zen Coding:css,html缩写替换大观---让你的html,css飞起来
查看>>
QTP基本脚本设计(第一部分)
查看>>
红蜻蜓截图工具在win7下保存截图为png失败
查看>>
Android -- Drawable与Bitmap测试
查看>>
Android视频播放-SurfaceView和Mediaplayer
查看>>