反射setaccessible_反射技术

反射机制作用
- 动态的加载类、动态的获取类的信息(属性,方法,构造器)
- 动态构造对象
- 动态调用类和对象的任意方法、构造器
- 动态调用和处理属性
- 获取泛型信息
- 处理注解
获取Class对象的方式有哪些?
1. Class clazz = Class.forName(全限定类名);
2. 类名.class
3. 对象名.getClass();
反射机制动态操作方法_属性_构造器
使用反射机制获取类的名称和属性的方法有哪些?
String getName();获取包名+类名
String getSimpleName();获取类名
Field getField(String fieldName) 得到公共的属性对象
Field getDeclareField(String fieldName) 得到指定名称的属性对象
Field []c.getDeclaredFields() 得到所有的属性对象
使用反射机制获取方法及构造方法的方法有哪些?
Method[] getDeclaredMethods() 得到公共的方法对象
Method[] c.getMethods() 得到父类及本类中的公共的方法对象
Method getDeclaredMethod(String methodName, Class …type)得到指定名称的
本类中公共的方法
Method getMethod(String methodName,Class type)得到本类或父类中的公共的方法
对象
Constructor[] getDeclaredConstructors() 得到公共的构造方法的对象
Constructor [] getConstructors() 得到公共的构造方法对象
Constructor getDeclaredConstructor(Class...type)得到指定参数的公共的构造方法对象
package com.sxt.fanshe;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;public class TestClass {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {//(1)获取类的名称Class forName = Class.forName("com.sxt.entity.User");//2.类名.class//Class calzz = User.class;//3.对象名.getClass()//User user = new User();//Class clazz = user.getClass();System.out.println("类的全名称:"+forName.getName());//获取包名+类名System.out.println("类的名称:"+forName.getSimpleName());//获取类名//获取父类的System.out.println("父类的全名称:"+forName.getSuperclass().getName());System.out.println("父类的名称:"+forName.getSuperclass().getSimpleName());System.out.println("-------------------------------------");//(2)获取类的属性System.out.println("获取类的属性:");Field field = forName.getField("username");System.out.println(field);//只能获取公共的属性Field[] fields = forName.getFields();//只能获取所有公共属性System.out.println("公共属性值共有:"+fields.length);for (Field field2 : fields) {System.out.println(field2);}//获取所有属性值System.out.println("获取所有属性值:");Field[] field3 = forName.getDeclaredFields();System.out.println("属性值共有:"+field3.length);for (Field field4 : field3) {System.out.println(field4);}System.out.println("-------------------------------------");//获取方法值Method[] getDeclaredMethods() 得到公共的方法对象System.out.println("得到公共的方法对象:");Method[] methods = forName.getDeclaredMethods();for (Method method : methods) {System.out.println(method);}System.out.println("-------------------------------------");System.out.println("得到父类的方法对象:");Method[] methods2 = forName.getMethods();for (Method method : methods2) {System.out.println(method);}System.out.println("-------------------------------------");//获取构造器System.out.println("获取构造器");Constructor[] constructors = forName.getConstructors();for (Constructor constructor : constructors) {Class[] parameterTypes = constructor.getParameterTypes();//获取参数类型int cMod = constructor.getModifiers();//获取构造器修饰符String name = forName.getName();//获取名字System.out.println(cMod+"---"+name+"---"+Arrays.toString(parameterTypes));System.out.println(constructor);}}
}

提高反射效率
通过设置setAccessible(true);方法取消安全检查。禁止安全检查,可以提高反射的运行速度
package com.sxt.fanshe;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;/*** 提高效率setAccessible(true);禁用安全检查,可以提高运行速度* @date 2019年8月8日*/
public class Test3 {public static void test01(){Object obj = new Object();long startTime = System.currentTimeMillis();//设置开始时间for (int i = 0; i < 1000000000; i++) {obj.hashCode();}long endTime = System.currentTimeMillis();//设置结束时间System.out.println("调用普通方法执行10亿次时间:"+(endTime-startTime)+"ms");}public static void test02() throws Exception{Object obj = new Object();Class clazz = obj.getClass();//获取hashcode方法Method method = clazz.getDeclaredMethod("hashCode", null);long startTime = System.currentTimeMillis();//设置开始时间for (int i = 0; i < 1000000000; i++) {
// obj.hashCode();method.invoke(obj);}long endTime = System.currentTimeMillis();//设置结束时间System.out.println("调用反射回调方法执行10亿次时间:"+(endTime-startTime)+"ms");}public static void test03() throws Exception{Object obj = new Object();Class clazz = obj.getClass();//获取hashcode方法Method method = clazz.getDeclaredMethod("hashCode", null);method.setAccessible(true);//设置是否取消安全检查long startTime = System.currentTimeMillis();//设置开始时间for (int i = 0; i < 1000000000; i++) {
// obj.hashCode();method.invoke(obj);}long endTime = System.currentTimeMillis();//设置结束时间System.out.println("调用优化后反射回调方法执行10亿次时间:"+(endTime-startTime)+"ms");}public static void main(String[] args) throws Exception {test01();test02();test03();}
}

反射操作泛型
Java 中的泛型仅仅是给编译器 javac 使用的,确保数据的安全性和免去强制类型转换的麻烦,但是一旦编译完成,所有与泛型有关的类型全部擦除。
使用泛型直接读取泛型,是读取不到的,因为反射是操作加载以后的类的。
package com.sxt.fanshe;import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;import com.sxt.entity.User;public class TestGeneric {public void test01(Map<String,User> map,List<User> list,String s){System.out.println("TestGeneric.test01()");}public Map<Integer,User> test02(){System.out.println("TestGeneric.test02()");return null;}public String test03(){System.out.println("TestGeneric.test03()");return null;}public static void main(String[] args) throws NoSuchMethodException, SecurityException {//获取test01方法的泛型参数信息Class c=TestGeneric.class;Method test01=c.getMethod("test01", Map.class,List.class,String.class);//获取带泛型参数的类型Type [] tytes=test01.getGenericParameterTypes();System.out.println(tytes.length);for (Type type : tytes) {//System.out.println("#"+type);if (type instanceof ParameterizedType) {Type[] genericType= ((ParameterizedType) type).getActualTypeArguments();//遍历每一个泛型参数中泛型的类型 for (Type genType : genericType) {System.out.println("泛型类型:"+genType);}System.out.println("n--------------------------");}}System.out.println("n----------------------------n");//获取test02方法返回值的泛型信息Method m2=c.getMethod("test02", null);Type returnType=m2.getGenericReturnType();//判断是否带有泛型if(returnType instanceof ParameterizedType){Type [] types=((ParameterizedType) returnType).getActualTypeArguments();for (Type type : types) {System.out.println("返回值的泛型类型:"+type);}}System.out.println("n------------------------------n");Method m3=c.getMethod("test03", null);Type returnType3=m3.getGenericReturnType();//System.out.println(returnType3);System.out.println(returnType3 instanceof ParameterizedType);}}

相关文章:

pthread_cond_wait()函数的详解
http://hi.baidu.com/tjuer/item/253cc6d66b921317d90e4483 了解 pthread_cond_wait() 的作用非常重要 -- 它是 POSIX 线程信号发送系统的核心,也是最难以理解的部分。 首先,让我们考虑以下情况:线程为查看已链接列表而锁定了互斥对象&#x…

CentOS7下python虚拟环境
搭建python虚拟环境 1.我们先创建一个隐藏目录 .virtualenvs,所有的虚拟环境都放在此目录下 :mkdir /root/.virtualenvs 2.安装虚拟环境 确认pip:whereis pip3 pip3 install virtualenv 安装virtualenvwrapper,为避免超时错误&…

WCDMA中的URA和LA/RA
1、关于URA的概念:URA(UTRAN Registration Area)是UTRAN内部区域的划分适用于UE处于RRC连接状态的情形,而且只能在UTRAN端使用(比如由UTRAN发起的寻呼)。一 个URA包含了一个或多个Cell,具体由决…

背景音乐的实现
通过利用Service来实现该功能将要播放的歌曲放入raw文件夹中[html] view plaincopy <strong>新建一个AudioService 类,<span style"font-family: Arial, Helvetica, sans-serif;">AudioService 类</span><span style"font-fami…

打牌软件可以控制吗_使用crm软件真的可以帮助企业省钱吗
使用crm软件真的可以帮助企业省钱吗大多数企业管理者认为:“客户关系系统有什么用?真的可以帮助企业发展吗?自己做一套excel版本不就行了”其实,不以为然,当我们去寻找用户时或者管理用户需要工作人员做一些繁琐的事情会极大的降低员工的工…

MS_SQL_获取字符串最后出现的字符串及位置
一.如:6.7.8.2.3.4.x得到最后一个.后面的字符串: declare str1 varchar(50) set str16.7.8.2.3.4.x select REVERSE(SUBSTRING(REVERSE(str1),1,CHARINDEX(.,REVERSE(str1))-1)) -------- string:x-- --------------------------------------…

redis(3)-redis基本类型
在redis安装目录下存在redis自带的客户端,启动即可使用。如果设置了密码,需要输入auth 123456进行验证。123456为密码。 redis的基本数据类型: 1.字符串类型(String) redis 127.0.0.1:6379> SET mykey "redis" OK redis 1…

虚函数与虚继承寻踪
封装、继承、多态是面向对象语言的三大特性,熟悉C的人对此应该不会有太多异议。C语言提供的struct,顶多算得上对数据的简单封装,而C的引入把struct“升级”为class,使得面向对象的概念更加强大。继承机制解决了对象复用的问题&…

信息记录拉取失败_天猫入驻为什么失败?猫店侠做详细解读
天猫入驻为什么失败?这是很多商家都想要知道的一件事情,猫店侠想说其实这也很正常,只要不是一味盲目的入驻,就还有机会。首先失败商家要看看失败的反馈内容,看看是哪方面不达标,再着重进行补充,…

Linux查看目录挂载点
用命令 df 即可 # df /var/lib/ Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 135979984 66905292 62055896 52% /加上-kh更容易看些: # df /var/lib/ -kh Filesystem Size Used Avail Use% Mounted o…

Android:你好,androidX!再见,android.support
190325 补充:莫名问题的解决 181106 补充:修改未迁移成功的三方库 1、AndroidX简介 点击查看Android文档中对androidx的简介 按照官方文档说明 androidx 是对 android.support.xxx 包的整理后产物。由于之前的support包过于混乱,所以…

设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。 本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解…

云计算和大数据时代网络技术揭秘(八)数据中心存储FCoE
数据中心存储演化——FCoE数据中心三大基础:主机 网络 存储在云计算推动下,存储基础架构在发生演变传统存储结构DAS、SAN在发展中遇到了布线复杂、能耗增多的缺点(原生性),需要对架构做根本的改变。FCoE是业界无可争议…

在plsql里面怎么去掉空行_盐渍樱花怎么做?详细做法告诉您,一年都不会坏,学会再也不用买...
盐渍樱花怎么做?详细做法告诉您,一年都不会坏,赶紧收藏学会它!樱花季说的就是现在,虽然到了飘落的季节,但是还是到处可见的樱花朵朵。俗话说:花无百日红。真的是啊,每年的三四月是最…

Linux基础知识——常用shell命令介绍(三)
一、改变文件权限 chmod:change mode 语法:# chmod [选项-option] 权限 FILE 选项:-R 递归修改权限 --reference 参照文件或目录给予权限 权限定义方式: 1.同时修改三类用户的权限: 8进制数字方式 # chmod 666 /abc /*将/abc的权限改为…

免费版CloudFlare CDN基本设置参考
CDN有很多,网上都有介绍,用户比较多的CloudFlare CDN大家都知道,配置起来也比较简单,合理的配置,才能提升网站的速度和网站安全。不同的网站需求配置不一样,以下是我的配置情况,仅供参考。 我网…

从Java类库看设计模式
//From http://www.uml.org.cn/j2ee/201010214.asp 很多时候,对于一个设计来说(软件上的,建筑上的,或者它他工业上的),经验是至关重要的。好的经验给我们以指导,并节约我们的时间;坏的经验则给我们以借鉴,可…

method=post 怎么让查看源代码看不到_网站文档不能复制怎么办?教你3个小妙招,1分钟轻松化解...
不知道大家平常在查找资料时,碰到网页资料不能下载时,是怎么样进行处理的。那么笔者今天就来分享我查找不能复制文档时,所用的3个小妙招,帮助轻松化解,一起来看看吧。1、保存网页当我们遇到一个不能直接复制的文档&…

Missing number
题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id114468 题目大意: 多组案例T,每个案例含n2个数据,这n2个数据构成一组有序列,现在已知这组数据中的n个,请找出缺失的两个数据。 …

[leetcode]Surrounded Regions @ Python
原题地址:https://oj.leetcode.com/problems/surrounded-regions/ 题意: Given a 2D board containing X and O, capture all regions surrounded by X. A region is captured by flipping all Os into Xs in that surrounded region. For example, X X …
Android Drawable 详解(教你画画!)
参考 1、Android中的Drawable基础与自定义Drawable2、android中的drawable资源3、Android开发之Shape详细解读 Drawable分类 Noxml标签Class类含义1shapeShapeDrawable特定形状,模型的图样2selectorStateListDrawable不同状态选择不同的图样3layer-listLayerDrawabl…

Carrier frequency 和 EARFCN的关系
Carrier frequency 和 EARFCN的关系 我们处理UE log时,看到LTE cell 都是用EARFCN/PCI来标示的,那么EARFCN和frequency 之间是什么关系呢? 1. EARFCN: 缩写: E-UTRA Absolute Radio Frequency Channel Number, 取值范围: 0…

十五天精通WCF——第六天 你必须要了解的3种通信模式
十五天精通WCF——第六天 你必须要了解的3种通信模式 原文:十五天精通WCF——第六天 你必须要了解的3种通信模式wcf已经说到第六天了,居然还没有说到这玩意有几种通信模式,惭愧惭愧,不过很简单啦,单向,请求-响应&#…

从未在一起更让人遗憾_明明是真爱,却又不能在一起
深爱一个人,若是无缘成为夫妻相偎相依在一起,在分开的很长一段时间里,一定会在深夜难眠,在梦中哭醒,因为你太爱他,太想他。人生那么长,在我们的一生中,总会有一个人,在你…

使用 IntraWeb (8) - 系统模板
我们可以自定义系统错误模板, 编辑 IWError.html 放到模板文件夹后, 它将替换默认的模板.{在主页面, 这是要模拟一个系统错误} procedure TIWForm1.IWButton1Click(Sender: TObject); beginRelease; end;修改前后的 IWError.html 对比:我想办法抠出了 IWError.html 源文件, 从里…

Java中常量定义的几种方式
编程中使用常量的优点: 常量提取出来有利于代码阅读,而且下次再做这种判断不用手写或复制并且提高代码的复用率,方便修改,直接通过常量类就能得到。不过我觉得提取出来并不会有利于代码性能提升,因为常量分配在内存的常…

PCT-36.523
LTE v 36 523-1:Part 1: Protocol conformance specification 定义了每个Case 运行的流程 v 36.523-2:Part 2: Implementation Conformance Statement(ICS) proforma specification. Table 4-1 定义了每个Case的详细背景: 1. 最早那个release 引入的这一c…

测试笔试题之相关概念
1、对手机软件的压力测试通常包括: (1)存储压力 (2)响应能力压力 (3)网络流量压力 (4)边界压力 2、针对手机应用软件的系统测试,我们通常从如下几个角度开展&…

ios 代码设置控件宽高比_用宽高比调整UIImage的大小?
我知道这很老了,但是感谢那篇文章-它使我从尝试使用比例尺重定向到绘制图像。万一对任何人都有利,我做了一个扩展类,我将在这里进行介绍。它允许您调整图像的大小,如下所示:UIImage imgNew img.Fit(40.0f, 40.0f);我不…
jquery入门 修改网页背景颜色
我们在浏览一些网站,尤其是一些小说网站的时候,都会有修改页面背景颜色的地方,这个功能使用jquery很容易实现。 效果图: show you code: <!doctype html> <html> <head> <meta charset"utf-8">…