我们常常说对于程序的开发模式之前一直强调:尽量减少耦合,而减少耦合的最好做法是使用接口,但是就算使用了接口也逃不出关键字new,所以实际上new是造成耦合的关键元凶,而反射就是在程序动态执行的时候获取到另外类的信息,想什么时候获取就获取不需要去new,到这里的解释感觉是不是和spring的依赖注入差不多,spring的IOC本身就是通过Java反射机制去实现的。
在我的理解里所谓的反射机制就是Java语言在运行时拥有的一项自观的能力,这种能力可以彻底的了界自身的情况为下一步做准备。
Java反射的作用:在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属性和方法。对于任意一个对象,可以调用它的任意一个方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。
Java 反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法
还是在代码中来体会下,代码尽量简单可以直接运行,运行完对于初学反射机制的同学就有一点印象了

package studyReflect;public class User {protected int age = 12;String name = "sureSand";public void studyJava(){System.out.println("Java反射机制调用我");}
}package studyReflect;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;public class JTest {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException {Class<String> clzz = String.class;//clzz表示String类型的类System.out.println(clzz.getName());//c1,c2,c3表示我们自己创建的User类Class c1 = User.class;//表示每个类有默认的class属性Class c2 = new User().getClass();Class c3 = Class.forName("studyReflect.User");//Spring将采用的代码创建代码Java实例//Class c = Class.forName("studyReflect.User");//Object bean = c.newInstance();System.out.println(c1.getName());System.out.println(c2.getName());System.out.println(c3.getName());//通过类实例化User的对象User user = (User) c3.newInstance();System.out.println("user的age: "+user.age);//获得User类的构造函数Constructor<?> cons[] = c3.getConstructors();System.out.println("user类的构造函数: "+cons);//获得User类的全部属性,反射也不能获取private修饰的属性Field[] field = c3.getDeclaredFields();for (int i = 0; i < field.length; i++) {// 权限修饰符int mo = field[i].getModifiers();String priv = Modifier.toString(mo);// 属性类型Class<?> type = field[i].getType();System.out.println(priv + " 权限" + type.getName() + "属性 " + field[i].getName() + ";");}//获得某个类的全部方法Method method[] = c3.getMethods();for (int i = 0; i < method.length; ++i) {Class<?> returnType = method[i].getReturnType();Class<?> para[] = method[i].getParameterTypes();int temp = method[i].getModifiers();System.out.print(Modifier.toString(temp) + " ");System.out.print(returnType.getName() + "  ");System.out.print(method[i].getName() + " ");System.out.print("(");for (int j = 0; j < para.length; ++j) {System.out.print(para[j].getName() + " " + "arg" + j);if (j < para.length - 1) {System.out.print(",");}}}//调用某个类的方法Method method1 = c3.getMethod("studyJava");try {System.out.println("");method1.invoke(c3.newInstance());} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

如果你定义了一个ArrayList list = new ArrayList();那么这个list集合能放String类型的数据吗?一般情况下是不可能的,但来用反射可以实现这个黑科技。

package studyReflect;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import org.junit.Test;public class JunitTest {@Testpublic void testArray() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ArrayList<Integer> list = new ArrayList<Integer>();Method method = list.getClass().getMethod("add", Object.class);method.invoke(list, "Java反射实例");list.add(1);System.out.println(list);}
}

Java反射到底反射什么?相关推荐

  1. Java反射到底慢在哪?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:https://www.jianshu.com/p/ ...

  2. java 反射 慢在那里_Java 反射到底慢在哪?

    反射具体是怎么影响性能的?这引起了我的反思. 是啊,在阐述某个观点时确实有必要说明原因,并且证明这个观点是对的,虽然反射影响性能人尽皆知,我曾经也真的研究过反射是否存在性能问题,但并没有在写文章的时候 ...

  3. 面试:Java反射到底慢在哪?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | jianshu.com/p/4e2b49fa8 ...

  4. 6.Java反射到底慢在哪

    来源:jianshu.com/p/4e2b49fa8ba1 反射真的存在性能问题吗?反射到底慢在哪?如果避免反射导致的性能问题?后记有朋友在我前两天写的一篇文章深入浅出反射底下留言,问反射具体是怎么影 ...

  5. java反射效率问题_Java反射到底慢在哪?

    原标题:Java反射到底慢在哪? 来自:简书,作者:张明云 链接:https://www.jianshu.com/p/4e2b49fa8ba1 反射具体是怎么影响性能的?这引起了我的反思.是啊,在阐述 ...

  6. java中反射到底是什么_JAVA中反射是什么

    烧仙草VB JAVA中的反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变.通俗的讲就是反射可以在运行时根据指定的类名获得类的信息.首先我们先明确两个概念,静态编译和动态编译. ...

  7. JAVA注解和反射(笔记)

    注解简介 Annotation是从JDK5.0开始引入的新技术). Annotation的作用 : 不是程序本身(可以对程序作出解释.(这一点和注释(comment)没什么区别) 可以被其他程序(比如 ...

  8. java中的反射总结

    刚开始学习java的时候真的很难理解反射到底是个什么东西 一些书籍,哪怕是很经典的书籍都解释的让人感觉懵懵的,或许的确是我太笨 况且,网上说在将来学习框架的时候需要经常应用到反射机制,这样一来总让人心 ...

  9. 【廖雪峰官方网站/Java教程】反射

    注:本文参考自:https://www.liaoxuefeng.com/wiki/1252599548343744/1255945147512512 什么是反射? 反射就是Reflection,Jav ...

最新文章

  1. OpenCV(十)ROI感兴趣区域
  2. 【机器学习入门】(3) 朴素贝叶斯算法:多项式、高斯、伯努利,实例应用(心脏病预测)附python完整代码及数据集
  3. 分布式事务篇——第一章:分布式事务前言
  4. linux ftrace原理
  5. python判断字符是否是字典的键_Python3基础 dict in/not in 查询一个字符是否指定字典的键或者值...
  6. freeswitch 把SIP注册信息数据库从SQLITE 改为MYSQL的方法
  7. ES6新特性之函数优化-参数默认值
  8. React Hooks的使用(一)——useState、useEffect解析
  9. batchplot插件用法_Batchplot怎么安装及使用?Batchplot的安装方法及使用方法介绍
  10. vue 使用了浏览器的刷新之后报错_Electron-vue运行之后出现了文件浏览器
  11. 宽依赖和窄依赖_Kardemir开始生产窄钢板,进入板材市场
  12. OpenJDK和Java API区别_Linux下的JDK和OpenJDK有什么具体的区别
  13. 阿里布局无人驾驶;滴滴成立汽车服务;“京东 AI 天团”首亮相| CSDN极客头条...
  14. git 21天打卡day10-创建昵称分支并切换
  15. 驰骋工作流程引擎在流程设计发生变化后如何处理?
  16. 原画学习步骤,零基础一步步学原画!
  17. 16款最佳的 jQuery Time Picker 时间选择插件
  18. Python爬虫有用的库:chardet,自动检测字符编码
  19. 数字化综合档案管理系统 佰档管家|匠心打造
  20. zoj3987—Numbers(贪心)

热门文章

  1. js方法-通过出生日期计算出当前年龄
  2. 2.Python数据基本运算
  3. OpenMP 学习(二)
  4. 掌握正确的运动姿势,很有必要!
  5. #HHD32F107# AD采集
  6. 深大计算机与软件学院院长,深圳大学计算机与软件学院自考办
  7. 敏捷遇上UML(深圳 2014.3.15)- 活动报道
  8. Magento支付宝手机网站支付插件V6.0旗舰版发布,支持在微信中使用支付宝支付,订单重新支付功能!...
  9. PHP错题本功能实现,错题作用:错题本让错误变的有价值
  10. python自制个人网盘_超简单!基于Python搭建个人“云盘”