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生 ...
随机推荐
- bpm 学习笔记一
名词解释: DC: Development Component WD:Web Dynpro Keep DC Local for Now
- Oracle中dbms_random.string 的用法
转载:https://blog.csdn.net/simonchi/article/details/8657787 DBMS_RANDOM.STRING(var1,var2) 这个函数有两个参数 va ...
- idea使用maven打包jar包
1.在pom.xml中加入以下内容: <?xml version="1.0" encoding="UTF-8"?> <project xmln ...
- vue中使用全局函数
方法一: 在mian.js中写入函数: Vue.prototype.bb = function () { alert('OK'); } 然后在任何组件中都可以调用: this.bb() ...
- Linux下查看编辑二进制文件:hexedit神器
1.如果没有hexedit安装hexedit:2.打开终端输入hexedit filename;3.打开即可用键盘输入字符,用方向键移动,ctrl+w保存,ctrl+x退出:4.详细用法 man he ...
- git和svn的对比
- HDU5532 Almost Sorted Array(最长上升子序列 or 瞎搞个做差的数组)
题目链接:点我 题意:给定一个序列,询问是否能删除一个数让它成为非递减或者非递增的序列. 比如说 删除后的序列是1 3 3 5 或者5 3 3 1 或者1 3 5 或者5 3 1 都可以.只要满足删掉 ...
- Python+Selenium学习--下拉框处理
场景 下拉框也是web 页面上非常常见的功能,webdriver 对于一般的下拉框处理起来也相当简单,要想定位下拉框中的内容,首先需要定位到下拉框:这样的二次定位 下拉框一般有以下两种方式: 鼠标移上 ...
- APIcloud制作APP 微信支付与支付宝支付
首先要在云端绑定相应模块如alipay和wxpay其次编写代码. 配置区域 var cfg = { webName:'',//APP名字 payDebug:true, isUseWxPay:true, ...
- Linux基石【第三篇】vim提示-bash:vim :common not found解决方法
在Linux命令行输入vim时提示:-bash:vim :common not found,之后按着查询到的解决办法整好了: 解决步骤如下: 1.输入 rpm -qa|grep vim 命令,查看返回 ...