本文会从以下几个方面讲起

① 反射的简单解释

② java反射的API接口 及 demo

③ 反射的优缺点、应用场景

一、什么是反射?

java反射:在程序运行中动态获取类的信息,及动态调用对象的方法,这就是java反射

二、java反射的API接口

常用API接口规律

getXX() : 获取类本身 及父类的public属性、方法等

getDeclaredXX() :  获取类本身的所有私有、保护属性、方法等

getDeclaredXX(String name) : 获取类本身的指定name的私有、保护属性、方法等(getDeclaredConstructors 较特殊, 还可以获取public)

以下demo涉及到的类先给出咯

package test.reflect;

// 父类
public abstract class Vehicle { public String superField = "父类属性"; private String superPrivateField = "父类私有属性"; protected String superProtectedField = "父类保护属性"; public abstract void run(); private void superPrivateMethod() { } protected void superProteMethod() { }
} // 飞机子类
package test.reflect; public class Airplane extends Vehicle { private String name; private int price; public String publicField; protected String protectedField; private Airplane() {
System.out.println("Airplane 构造函数");
} public Airplane(String name, int price) {
this.name = name;
this.price = price;
} public void run() { System.out.println("春节,坐飞机飞回家~~~");
} protected void protectedMethod() { } private void privateMethod() { } public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getPrice() {
return price;
} public void setPrice(int price) {
this.price = price;
} }
// 高铁子类
package test.reflect; public class HighSpeedTrain extends Vehicle { private String name; private int price; public void run() { System.out.println("春节,坐高铁溜回家~~~");
} private HighSpeedTrain() { } protected HighSpeedTrain(String name) { } public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getPrice() {
return price;
} public void setPrice(int price) {
this.price = price;
} }

① 使用反射构建对象

 private static void demo2() throws Exception {

         Class.forName("test.reflect.Airplane").newInstance();

         Airplane.class.newInstance();

         Airplane.class.getDeclaredConstructor(new Class[]{}).newInstance(); // new Class[]{} 使用无惨构造函数
}

所有类都是Class对象, 获取class 有以下三种

Class.forName(包名+类名)

xx.class

xx.getClass

②  获取属性

getFields() : 获取父子类的所有public属性

getDeclaredFields() : 获取子类的所有private\protected属性

demo如下 :

private static void demo3() throws Exception {
//  获取父子类的所有public属性
Field[] fields = Airplane.class.getFields();
for(Field f : fields) {
print(f.getName());
}
// 获取子类的所有private\protected属性
Field[] fields2 = Airplane.class.getDeclaredFields();
for(Field f : fields2) {
print(f.getName());
}
// 获取指定属性名的属性
Field f = Airplane.class.getDeclaredField("name");
print(f.getName());
}

结果

 -------getFields-------

 publicField

 superField

 -------getDeclaredFields-------

 name

 price

 publicField

 protectedField

 --------getDeclaredField(String)------

 name

③ 获取方法

getMethods() : 获取父子类的所有public方法

getDeclaredMethods() : 获取子类的所有private\protected方法

demo如下 :

    private static void demo4() throws Exception {

        Method[] methods = Airplane.class.getMethods();
for(Method m : methods) {
print(m.getName());
} Method[] methods2 = Airplane.class.getDeclaredMethods();
for(Method m : methods2) {
print(m.getName());
} Method m = Airplane.class.getDeclaredMethod("getName");
print(m.getName()); }

结果 :

 ------getMethods--------
run
getName
setName
getPrice
setPrice
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
------getDeclaredMethods--------
run
getName
setName
protectedMethod
privateMethod
getPrice
setPrice
--------getDeclaredMethod------
getName

④  获取构造函数(和前面有所区别,指类本身的构造函数,不包括父类)

getConstructors() : 获取public构造函数

getDeclaredConstructors() : 获取子类的所有private\protected\public构造函数 (注意 : 这里还能获取public的, 和 getDeclaredFields getDeclaredMethods 不同)

demo如下 :

Airplane构造函数是public修饰
private static void demo5() throws Exception { Constructor<?>[] constructors = Airplane.class.getConstructors();
for(Constructor c : constructors) {
print(c.getName());
} System.out.println("--------------");
Constructor<?>[] constructors2 = Airplane.class.getDeclaredConstructors();
for(Constructor c : constructors2) {
print(c.getName());
} System.out.println("--------------");
Constructor<Airplane> c = Airplane.class.getDeclaredConstructor(new Class[]{String.class, int.class});
print(c.getName()); }
// 结果
-------getConstructors-------
test.reflect.Airplane
-------getDeclaredConstructors-------
test.reflect.Airplane
test.reflect.Airplane
-------getDeclaredConstructor(Class<?>)-------
test.reflect.Airplane HighSpeedTrain构造函数是private protected修饰
private static void demo6() throws Exception { System.out.println("------getConstructors--------");
Constructor<?>[] constructors = HighSpeedTrain.class.getConstructors();
for(Constructor c : constructors) {
print(c.getName());
} System.out.println("------getDeclaredConstructors--------");
Constructor<?>[] constructors2 = HighSpeedTrain.class.getDeclaredConstructors();
for(Constructor c : constructors2) {
print(c.getName());
}
}
// 结果
------getConstructors--------
------getDeclaredConstructors--------
test.reflect.HighSpeedTrain
test.reflect.HighSpeedTrain

三、java 反射的优缺点

① 优点 :

  • 在运行时检测对象的类型;
  • 动态构造某个类的对象;
  • 检测类的属性和方法;
  • 任意调用对象的方法;
  • 修改构造函数、方法、属性的可见性;
  • 以及其他。

② 缺点 :性能下降 . 由于反射涉及动态解析类型, 所以使用反射构建对象 比 直接构造对象性能差了一两个数量级

    private static void demo7() throws Exception {

        long start = System.currentTimeMillis();
for(int i = 0; i < 10000; i++) {
Airplane a = new Airplane();
}
System.out.println(System.currentTimeMillis() - start); start = System.currentTimeMillis();
for(int i = 0; i < 10000; i++) {
Airplane a2 = Airplane.class.getDeclaredConstructor().newInstance();
}
System.out.println(System.currentTimeMillis() - start);
}
// 结果
4
54

四、反射应用场景

① junit test, 使用注解@Test , 底层无非是使用反射来获取加了Test的注解标识,从而获取到测试方法。

② spring aop思想, spring 加载bean xml 配置文件, 使用 Class.forName(String beanName) 动态构造bean, 也都是反射的经典例子。

java反射快速入门(一)的更多相关文章

  1. java反射快速入门(二)

    上一遍博文 , 简单介绍java 反射的常用接口,本遍博文, 我会结合项目开发的实际例子讲解下 java反射的使用 现在有个需求, 要将一个对象转换成xml格式, 或者将一串xml转换一个对象, 这时 ...

  2. java反射快速入门

    笔记记在了掘金,发现掘金的markdown编辑器比博客园样式要好看不少 https://juejin.im/post/5d4e575af265da03e4674e9f

  3. JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识

    JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...

  4. JAVA WEB快速入门之从编写一个基于SpringMVC框架的网站了解Maven、SpringMVC、SpringJDBC

    接上篇<JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP.IOC)>,了解了Spring的核心(AOP.IOC)后,我们再来学习与实践Maven.Sp ...

  5. java反射机制入门01

    java反射机制入门是我从极客学院的视频中学习的. 1.反射机制背景概述 反射(Reflection)是java被视为动态(或准动态)语言的一个关键性质.反射机制指的是程序在运行时能够获取任何类的内部 ...

  6. Java Web快速入门——全十讲

    Java Web快速入门——全十讲 这是一次培训的讲义,就是我在给学生讲的过程中记录下来的,非常完整,原来发表在Blog上,我感觉这里的学生可能更需要. 内容比较长,你可以先收藏起来,慢慢看. 第一讲 ...

  7. 大白话说Java反射:入门、使用、原理

    文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java反射:入门.进阶.原理> 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释. 一般情况下,我们使用某个类时 ...

  8. JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP、IOC)

    接上篇<JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构.调试.部署>,通过一个简单的JSP WEB网站了解了JAVA WEB相关的知识,比如:Ser ...

  9. JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构、调试、部署

    接上篇<JAVA WEB快速入门之环境搭建>,在完成了环境搭建后(JDK.Tomcat.IDE),现在是万事具备,就差写代码了,今天就来从编写一个JSP WEB网站了解JSP WEB网站的 ...

随机推荐

  1. eay ui iframe 下常问题

    背景:客户要使用https进行登录,把原来的登录做到一个小框,用iframe嵌进来进行登录. 客户拥有4个域名,但只在xxx.com域名中购买了安全证书,所以多个域名下登录所用的iframe中src是 ...

  2. 如何提高Web服务端并发效率的异步编程技术

    作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...

  3. Octave下载

    发福利啦,今天下了半天Octave都没下载下来,最后让一个香港的同学帮忙下好传过来的....放到网盘里造福大家 GNU_Octave_3.8.0-6.dmg 链接: http://pan.baidu. ...

  4. 无效的 URI: 未能分析证书颁发机构/主机

    出 现该错误的原因是URL中少了一个斜杠,正常的URL是“http:”后边有两个斜杠,而我在修改配置文件中的URL的IP地址部分时,不小心删掉了一个 斜杠,例如:http:/blog.csdn.net ...

  5. android从应用到驱动之—camera(1)---程序调用流程[转]

    一.开篇 写博客还得写开篇介绍,可惜,这个不是我所擅长的.就按我自己的想法写吧. 话说camera模块,从上层到底层一共包含着这么几个部分: 1.apk------java语言 2.camera的ja ...

  6. Windows 7/8 创建WIFI热点

    问题描述:很多人(特别是中国的大学生)都拥有一台联网的笔记本电脑,而手机使用的却是电信运营商提供的限制数量和速度的GPRS. 很多人不敢想象:联网的笔记本电脑能够将其流量以WiFi的形式共享出来供其它 ...

  7. 几种java通信(rmi,http,hessian,webservice)协议性能比较

    一.综述 本文比较了RMI,Hessian,Burlap,Httpinvoker,web service等5种通讯协议的在不同的数据结构和不同数据量时的传输性能.RMI是java语言本身提供的通讯协议 ...

  8. pku,杨建武:文本挖掘技术

    http://webkdd.org/course/ http://www.icst.pku.edu.cn/lcwm/course/WebDataMining/ http://www.icst.pku. ...

  9. DataTable导出到Excel(.NET 4.0)

    最近在论坛里又看到很多关于DataTable(DataSet)导入Excel的帖子,我也温故知新一下,用VS2010重新整理了一个Sample.这个问题简化一下就是内存数据到文件,也就是遍历赋值,只不 ...

  10. POJ 3281 Dining (网络流构图)

    [题意]有F种食物和D种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料.现在有N头牛,每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享用到自己喜欢的食物和 ...