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生 ...
随机推荐
- 在project窗口中快速定位文件
[在project窗口中快速定位文件] 点击带圆圈的小叉叉按钮,这个时候Project中就会定位到当前文件目录下了. 参考:http://blog.csdn.net/hyr83960944/artic ...
- sql 2012的补丁 SP4下载地址
https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=56040
- 【C++】子类访问父类typedef的问题
class A { public: typedef int* pointer; }; class B :public A { public: pointer b; }; 这段代码运行没有问题,子类继承 ...
- 使用Fiddler查看APP的请求接口、接口参数和返回值的方法
1.下载Fiddler,然后安装成功后. 2.开启代理的设置 3.查看电脑的ip, 4.建立一个wifi局域网,什么360wifi,猎豹wifi,腾讯wifi都可以,用安装手机接入到这个局域网的wif ...
- js常用返回网页顶部几种方法
一.使用锚标记 此方法最简单,只需在body下放个隐藏的锚点标记,内容如下: 代码如下 复制代码 <a name="top" id="top">& ...
- WOPI的安装文档方法
Office Web Apps安装部署 系统要求为Windows Server 2012, 注意:安装Office Web Apps的服务器除了Office Web Apps之外,不能安装其他应用.包 ...
- openstack 相关服务常用命令整理
1. 数据库: # systemctl start mysqld # systemctl enable mysqld # systemctl status mysqld #mysql> show ...
- laravel中的模型关联之(一对多)
一对多 一对多就相当于,一个用户有多篇文章,这多篇文章都对应一个用户 这是一张文章表,一个用户有多篇文章,这里是在用户模型里面获取用户的所有文章, 第二个参数就是获取的模型文章表(post)里面的用户 ...
- Codeforces Beta Round #63 (Div. 2)
Codeforces Beta Round #63 (Div. 2) http://codeforces.com/contest/69 A #include<bits/stdc++.h> ...
- js和jquery实现图片无缝轮播的不同写法
多掌握一种方法总是会有好处的,学习编程就要多思考,举一反三 下面写一下实现图片自动播放的代码,由于学习的是javascript,代码量很大,所以又学习了jquery库的操作,非常简便 还有非常有逼格的 ...