在说反射之前,必须得先说说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高级技术 - 反射的更多相关文章

  1. javase高级技术 - 泛型

    在写案例之前,先简单回顾下泛型的知识 我们知道,java属于强变量语言,使用变量之前要定义,并且定义一个变量时必须要指明它的数据类型,什么样的数据类型赋给什么样的值. 所谓“泛型”,就是“宽泛的数据类 ...

  2. paip.java 架构师之路以及java高级技术

    paip.java 架构师之路以及java高级技术 1.    Annotation 设计模式... 概念满天飞.ORM,IOC,AOP. Validator lambda4j memcache. 对 ...

  3. Java基础(十三) 文件高级技术

    文件高级技术 一.常见文件类型处理 一)属性文件 属性文件很简单,一行表示一个属性,属性就是键值对,键和值用(=)或者(:)分隔. #ready to work name = tang age = p ...

  4. [译]基于GPU的体渲染高级技术之raycasting算法

    [译]基于GPU的体渲染高级技术之raycasting算法 PS:我决定翻译一下<Advanced Illumination Techniques for GPU-Based Volume Ra ...

  5. 【ASP.NET Identity系列教程(三)】Identity高级技术

    注:本文是[ASP.NET Identity系列教程]的第三篇.本系列教程详细.完整.深入地介绍了微软的ASP.NET Identity技术,描述了如何运用ASP.NET Identity实现应用程序 ...

  6. .net高级技术(class0515)

    本次课程中讲的有的东西都是根据初学者的认知规律进行了调整,并不是严谨的,比如很多地方在多AppDomain条件下很多说法就不对了,但是说严谨了大家就晕了,因此继续不严谨的讲吧. 很多面试题都在这阶段的 ...

  7. .Net高级技术

    本次课程中讲的有的东西都是根据初学者的认知规律进行了调整,并不是严谨的,比如很多地方在多AppDomain条件下很多说法就不对了,但是说严谨了大家就晕了,因此继续不严谨的讲吧. 很多面试题都在这阶段的 ...

  8. 【Spring】Spring MVC高级技术

    前言 前面学习了简单的Spring Web知识,接着学习更高阶的Web技术. 高级技术 Spring MVC配置的替换方案 自定义DispatcherServlet配置 在第五章我们曾编写过如下代码. ...

  9. DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明

    From http://blog.csdn.net/sunstone/article/details/5282666 DataSnap高级技术(7)—TDSServerClass中Lifecycle生 ...

随机推荐

  1. React DevTools

    [React DevTools] 在应用商店搜索安装.F12可打开.如果是react应用,在最右排会显示react标签. 参考:https://github.com/facebook/react-de ...

  2. Spring整合EHCache框架

    在Spring中使用缓存可以有效地避免不断地获取相同数据,重复地访问数据库,导致程序性能恶化. 在Spring中已经定义了缓存的CacheManager和Cache接口,只需要实例化便可使用. Spr ...

  3. 读取excel表格以及生成自动化报告

    数据库读取 标签(空格分隔): 数据库读取 读excel数据xlrd 当登录的账号有多个的时候,我们一般用excel存放测试数据,本节课介绍,python读取excel方法,并保存为字典格式. 1.先 ...

  4. IN_ITEMBOMROUTING中的数据被过滤 到IN_ITEMBOMROUTING_TEMP

    ' ; 解决方法: 检查如下数据是否存在就可以知道为什么被过滤 掉 ' ) ' )

  5. asp.net MVC 异常处理

    http://www.cnblogs.com/think8848/archive/2011/03/18/1987849.html http://www.cnblogs.com/snowdream/ar ...

  6. scrapy 是指user_agent

    1.倒入random模块 2.在settings文件中添加useragent列表 MY_USER_AGENT = [ "Mozilla/4.0 (compatible; MSIE 6.0; ...

  7. python全栈 字典数据类型相关知识及操作

    python 全栈开发 一.字典 1. 字典的概念: 字典 : dict 用 {} 来表示,   键位值数据. { key , value }    具有唯一性. 键:都必须是可哈希的     不可变 ...

  8. springboot jpa 审计

    @SpringBootApplication @EnableJpaAuditing public class Application {...} @Component public class Aud ...

  9. css3 vw、vh属性详解,以及与%、rem的区别介绍

    最近的项目需求,内嵌电视端显示页面,所以使用到了css3的属性:vw \ vh,遇到一些问题,记录下来 vw.vh是什么? 字面上可以简单理解为,vw (view width),vh(view hei ...

  10. c++ 读入优化、输出优化模板

    0. 在有些输入数据很多的变态题中,scanf会大大拖慢程序的时间,cin就更慢了,所以就出现了读入优化.其原理就是一个一个字符的读入,输出优化同理,主要使用getchar,putchar函数. 1. ...