反射的意义

    你可能说,平时都是业务的增删查改基本用不到反射。但是如果你学会用反射了,可以减少重复代码,非常的好用。

反射是Java语言的一大特性,允许动态的修改程序行为。

代码说反射

1、反射的三个入口

   try {
Class<?> perClazz = Class.forName("reflector.Person");
System.out.println(perClazz);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} Class<?> perClass1 = Person.class;
System.out.println(perClass1); Person person = new Person();
Class<?> perClass2 = person.getClass();
System.out.println(perClass2);

     2、反射的基本操作

      //反射调用静态方法。
try {
Class<?> perClass=Class.forName("reflector.Person");
Method method = perClass.getMethod("staticMethod",String.class);
method.invoke(perClass.newInstance(),"zhangzhen");
} catch (Exception e) {
e.printStackTrace();
}
//反射创建对象
try {
Class<?> perClass=Class.forName("reflector.Person");
Person person=(Person)perClass.getConstructor().newInstance();
person.setAge(1);
System.out.println(person.getAge());
} catch (Exception e) {
e.printStackTrace();
}
//反射调用实例方法
try {
Class<?> perClass=Class.forName("reflector.Person");
Method method = perClass.getMethod("interfaceMethod");
method.invoke(perClass.newInstance());
} catch (Exception e) {
e.printStackTrace();
}
//反射调用私有方法
try {
Class<?> perClass=Class.forName("reflector.Person"); //再次说明,你要调用私有的方法,一定要用这个getDeclaredMethod ,因为只有这个才是没有访问权限的控制。
Method method = perClass.getDeclaredMethod("privateMethod");
method.setAccessible(true);
method.invoke(perClass.newInstance(),null);
} catch (Exception e) {
e.printStackTrace();
}
//反射调用重载方法
try {
Class<?> perClass=Class.forName("reflector.Person");
//反射调用重载方法的时候,主要是由声明时候的参数类型决定的,和你具体传值是无关的。
Method method = perClass.getDeclaredMethod("SayHello",int.class);
method.setAccessible(true);
method.invoke(perClass.newInstance(),Integer.valueOf(300));
} catch (Exception e) {
e.printStackTrace();
} // 反射越过泛型检查 ;
try {
ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(2);
arrayList.add(3);
Method method= arrayList.getClass().getMethod("add", Object.class);
method.invoke(arrayList,"test");
for (int i = 0; i <arrayList.size() ; i++) {
System.out.println(arrayList.get(i));
}
}catch (Exception ex){
System.out.println(ex.getMessage());
} //反射动态加载
Properties properties = new Properties();
System.out.println(System.getProperty("user.dir"));
properties.load(new FileReader("1.txt"));
String className=properties.getProperty("ClassName");
String methodName=properties.getProperty("MethodName");
try {
Class<?> perClass = Class.forName(className);
//反射调用重载方法的时候,主要是由声明时候的参数类型决定的,和你具体传值是无关的。
Method method = perClass.getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(perClass.newInstance());
} catch (Exception e) {
e.printStackTrace();
}     

反射的应用

  1、IDE里面的智能提示,通过反射实现。

   2、框架中,也离不开反射(ORM,IOC等等)

3、平时写一些ConvertDTO也会用到反射

4、做一些插件式开发也会用到反射  

    

Java常用--反射的更多相关文章

  1. Java常用类及反射,类加载

    1.系统相关类 Java提供了System类和Runtime类来与程序运行的平台进行交互 A.System类代表当前Java程序的运行平台 a. System类是一个final类,该类的所有属性和方法 ...

  2. java常用英文解释

    java常用名词解释: OO: object-oriented ,面向对象 OOP:object-oriented programming,面向对象编程 Author:JCC Object:对象JDK ...

  3. Java基础 —— Java常用类

    Java常用类: java.lang包: java.lang.Object类: hashcode()方法:返回一段整型的哈希码,代表地址. toString()方法:返回父类名+"@&quo ...

  4. JAVA常用知识点及面试题总结

    1. String.StringBuffer.StringBuilder三者区别? (1)三者在执行速率上的比较: String<StringBuffer<StringBuilder 原因 ...

  5. Java常用排序算法及性能测试集合

    测试报告: Array length: 20000 bubbleSort : 573 ms bubbleSortAdvanced : 596 ms bubbleSortAdvanced2 : 583 ...

  6. 【转】java原理—反射机制

    一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言 ...

  7. 014 Java的反射机制

    作者:nnngu GitHub:https://github.com/nnngu 博客园:http://www.cnblogs.com/nnngu 简书:https://www.jianshu.com ...

  8. java原理—反射机制

    http://www.cnblogs.com/forlina/archive/2011/06/21/2085849.html 一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程 ...

  9. 利用Java的反射与代理机制实现AOP

    在上一篇文章中,我们讲述了利用Java的反射机制中实现Spring中的IOC,在本文中,我们将更进一步,讲述用Java的反射和动态代理机制来实现Spring的AOP. 一.AOP概述 AOP(Aspe ...

随机推荐

  1. Method com/mchange/v2/c3p0/impl/NewProxyResultSet.isClosed()Z is abstract

    HTTP Status 500 - Handler dispatch failed; nested exception is java.lang.AbstractMethodError: Method ...

  2. 什么是挂载?linux中挂载详解

    目录 一:什么是挂载,linux中挂载详解 一:什么是挂载,linux中挂载详解 1.linux中'一切皆文件',所有文件都放置在以根目录为树根的树形目录结构中.在linux看来,任何硬件设备也都是文 ...

  3. linux可用内存判断

    free是完全没有占用的空闲内存,Available 减 free是操作系统为了优化运行速度拿来调用的内存, 程序需要的话操作系统会进行释放.所以一般看Available即可. free+buffer ...

  4. hexo博客如何插入图片

    Hexo是一个静态的博客网站生成器,生成一个博客只需要分分钟的时间就能搞定. Hexo的博文是支持Markdown格式的,发表一篇文章只需要简简单单的几个命令. hexo new '文章'就会生成一个 ...

  5. KL散度非负性证明

    1 KL散度 KL散度(Kullback–Leibler divergence) 定义如下: $D_{K L}=\sum\limits_{i=1}^{n} P\left(x_{i}\right) \t ...

  6. Spring @SessionAttributes注解 @ModelAttribute注解

    一.@SessionAttribute详解 如果多个请求之间需要共享数据,就可以使用@SessionAttribute. 配置的方法: 在控制器类上标注@SessionAttribute. 配置需要共 ...

  7. Vue之watch监听对象中某个属性的方法

    新建 userinfo = { name: "小明",  age: "18", } vue中watch监听name的方法 1. 可以结合计算属性的方法实现 { ...

  8. 实际工程中加快 Java 代码编写的小提示

    这里我简单谈谈 Java 语法在编程效率方面的弱势,以及如何补救. 一.集合的快速创建 C# 是少数拥有集合字面值(又叫初始化表达式)的静态语言之一. var list = new List<i ...

  9. MySql数据存储格式Compact及计算MySql的B+Tree高度

    1.MySql的compact行记录格式 MySql从版本5.1以后默认使用的是compact行记录格式.可以通过执行以下命令查询到Row_format知悉InnoDB行记录格式类型. show ta ...

  10. CF954H Path Counting

    一开始的想法是枚举路径的 \(\rm LCA\) 然后再枚举两边的深度,但是这样无论如何我都只能做到 \(O(n ^ 3)\) 的复杂度. 只能考虑换一种方式计数,注意到点分治可以解决树上一类路径问题 ...