javase高级技术 - 反射
在说反射之前,必须得先说说java的类加载器,类加载器的定义:将.class文件加载到内在中,并为之生成对应的Class对象。
一般有三种
1 Bootstrap ClassLoader 根类加载器
也被称为引导类加载器,负责Java核心类的加载
比如System,String等。在JDK中JRE的lib目录下rt.jar文件中
2 Extension ClassLoader 扩展类加载器
负责JRE的扩展目录中jar包的加载。
在JDK中JRE的lib目录下ext目录
3 Sysetm ClassLoader 系统类加载器
负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径
接下来,我们在说反射
反射的定义
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。【简单来说 通过class字节码文件来获取他的构造方法,方法和属性的这种技术,叫做反射】
反射的几种用法
在使用反射之前,我们需要获取Class对象
一般有三种方式可以获得
1类名.class
2.对象.getClass()
3.使用Class.forName("类的完整包名"); 推荐使用这种。
通过反射,我们可以获取到类的构造方法,成员变量,成员方法。(包含private的)所以一般为了安全,字节码文件会加密的。
获取构造方法
获取构造方法
getConstructors //返回构造方法数组
getDeclaredConstructors //获取私有的构造方法数组
创建对象
newInstance()
con.newInstance(“zhangsan", 20); //有参构造
获取成员变量
获取所有成员
getFields,getDeclaredFields
获取单个成员
getField,getDeclaredField
修改成员的值
set(Object obj,Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
获取成员方法
获取所有方法
getMethods
getDeclaredMethods
获取单个方法
getMethod
getDeclaredMethod
暴力访问
method.setAccessible(true); //可以访问私有的
以下是代码
普通java类
package com.demo;
public class Demo {
private String name;
private int age;
public String ssss;
public Demo(String name) {
this.name = name;
}
public Demo() {
}
private Demo(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show() {
System.out.println(name);
}
public void showString(String s) {
System.out.println("s____" + s);
}
public String gets(String s) {
return s;
}
@Override
public String toString() {
return ("name__" + name + "age__" + age);
}
}
测试构造方法【目的是为了实例化对象】
@Test
public void testConstructor()
{
Class<?> dc;
try {
dc = Class.forName("com.demo.Demo");
Constructor[] cons = dc.getConstructors();
for(Constructor cc:cons)
{
System.out.println(cc);
//结果如下
//public com.demo.Demo()
//public com.demo.Demo(java.lang.String)
}
//获取单个
Constructor cc = dc.getConstructor(String.class);
Object ob = cc.newInstance("aaaa");
System.out.println(ob);
//获取私有的构造该方法
Constructor ccint = dc.getDeclaredConstructor(int.class);
ccint.setAccessible(true);//暴力访问
Object o = ccint.newInstance(111);
System.out.println(o); //结果 age__111
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
测试成员变量以及成员方法
@Test
public void testFieldAndMethod() {
Class<?> dc;
try {
dc = Class.forName("com.demo.Demo");
Field[] fields = dc.getDeclaredFields(); //获取所有的成员变量 包含私有的 for (Field f : fields) {
System.out.println(f.toString());
}
// 结果如下
// private java.lang.String com.demo.Demo.name
// private int com.demo.Demo.age
// public java.lang.String com.demo.Demo.ssss
Field nameField = dc.getDeclaredField("name");
// 暴力访问
nameField.setAccessible(true);
Constructor cc = dc.getConstructor(String.class);
Object ob = cc.newInstance("string");
//赋值语句
nameField.set(ob, "name test ");
System.out.println(ob); //结果 name__name test
//3成员方法
Method showStringMethod = dc.getDeclaredMethod("showString", String.class);
showStringMethod.invoke(ob, "ssss"); //通过invok执行
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
javase高级技术 - 反射的更多相关文章
- javase高级技术 - 泛型
在写案例之前,先简单回顾下泛型的知识 我们知道,java属于强变量语言,使用变量之前要定义,并且定义一个变量时必须要指明它的数据类型,什么样的数据类型赋给什么样的值. 所谓“泛型”,就是“宽泛的数据类 ...
- paip.java 架构师之路以及java高级技术
paip.java 架构师之路以及java高级技术 1. Annotation 设计模式... 概念满天飞.ORM,IOC,AOP. Validator lambda4j memcache. 对 ...
- Java基础(十三) 文件高级技术
文件高级技术 一.常见文件类型处理 一)属性文件 属性文件很简单,一行表示一个属性,属性就是键值对,键和值用(=)或者(:)分隔. #ready to work name = tang age = p ...
- [译]基于GPU的体渲染高级技术之raycasting算法
[译]基于GPU的体渲染高级技术之raycasting算法 PS:我决定翻译一下<Advanced Illumination Techniques for GPU-Based Volume Ra ...
- 【ASP.NET Identity系列教程(三)】Identity高级技术
注:本文是[ASP.NET Identity系列教程]的第三篇.本系列教程详细.完整.深入地介绍了微软的ASP.NET Identity技术,描述了如何运用ASP.NET Identity实现应用程序 ...
- .net高级技术(class0515)
本次课程中讲的有的东西都是根据初学者的认知规律进行了调整,并不是严谨的,比如很多地方在多AppDomain条件下很多说法就不对了,但是说严谨了大家就晕了,因此继续不严谨的讲吧. 很多面试题都在这阶段的 ...
- .Net高级技术
本次课程中讲的有的东西都是根据初学者的认知规律进行了调整,并不是严谨的,比如很多地方在多AppDomain条件下很多说法就不对了,但是说严谨了大家就晕了,因此继续不严谨的讲吧. 很多面试题都在这阶段的 ...
- 【Spring】Spring MVC高级技术
前言 前面学习了简单的Spring Web知识,接着学习更高阶的Web技术. 高级技术 Spring MVC配置的替换方案 自定义DispatcherServlet配置 在第五章我们曾编写过如下代码. ...
- DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明
From http://blog.csdn.net/sunstone/article/details/5282666 DataSnap高级技术(7)—TDSServerClass中Lifecycle生 ...
随机推荐
- JMeter学习(十七)JMeter测试MongoDB(转载)
转载自 http://www.cnblogs.com/yangxia-test JMeter测试MongoDB性能有两种方式,一种是利用JMeter直接进行测试MongoDB,还有一种是写Java代码 ...
- java并发:CopyOnWriteArrayList简单理解
Java集合的快速失败机制 “fail-fast” "fail-fast"是java集合的一种错误检测机制,当多个线程对集合进行结构上的改变的操作时,有可能会产生 fail-fas ...
- 贪吃蛇 Java实现(一)
贪吃蛇 Java实现 1.面向对象思想 1.创建antition包它是包含sanke Ground Food类 2.创建Controller包controller类 3.创建Game包有game类 ...
- JS中取得<asp:TextBox中的值
var s = document.getElementById("<%=txt_DaShen.ClientID %>").value; 注:txt_DaShen 为as ...
- avoid
avoid 英[əˈvɔɪd] 美[əˈvɔɪd] vt. 避开,避免,预防; [法] 使无效,撤销,废止; [例句]The pilots had to take emergency action t ...
- 互联网进行限流策略的Semaphore信号量使用
在Semaphore信号量非常适合高并发访问,新系统在上线之前,要对系统的访问量进行评估,当然这个值肯定不是随便拍拍脑袋就能想出来的,是经过以往的经验.数据.历年的访问量,已经推广力度进行一个合理的评 ...
- TZOJ 2725 See you~(二维树状数组单点更新区间查询)
描述 Now I am leaving hust acm. In the past two and half years, I learned so many knowledge about Algo ...
- Unicode编码字符范围和具体文字
1)标准CJK文字 http://www.unicode.org/Public/UNIDATA/Unihan.html 2)全角ASCII.全角中英文标点.半宽片假名.半宽平假名.半宽韩文字母:FF0 ...
- 民生银行十五年的数据体系建设,深入解读阿拉丁大数据生态圈、人人BI 是如何养成的?【转】
早在今年的上半年我应邀参加了由 Smartbi 主办的一个小型数据分析交流活动,在活动现场第一次了解到了民生银行的阿拉丁项目.由于时间关系,嘉宾现场分享的内容非常有限.凭着多年对行业研究和对解决方案的 ...
- 4-java 格式化输出
java保留两位小数4种方法 import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberF ...