反射的意义

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

反射是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. pytest文档6-allure-pytest

    allure-pytest 环境准备 windows环境相关: python 3.6版本pytest 4.5.0版本allure-pytest 2.8.6 最新版 使用pip安装pytest和allu ...

  2. [HNOI2009]双递增序列

    不难发现本题贪心是不好做的,可以考虑 \(dp\). 首先的一个想法就是令 \(dp_{i, j, k, l}\) 表示当前选到第 \(i\) 个位置,当前第一个序列选了 \(j\) 个数,当前第一个 ...

  3. Zookeeper应用场景汇总(超详细)

    Zookeeper典型应用场景汇总 数据发布与订阅(配置中心) 发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新.例 ...

  4. rabbitMq使用guest登录不上的问题总结

    自己mac电脑上的mq在电脑关机(直接按电源键关机),在开机后,rabbitMq连不上了,报500错误. 1.在使用brew uninstall rabbitmq --force后; 2.我手动安装了 ...

  5. SendMessage 键值

    转载请注明来源:https://www.cnblogs.com/hookjc/ SendMessage(hWnd,WM_SETFOCUS,0,0); SendMessage(hWnd,WM_ACTIV ...

  6. 使用UrlConnection请求一个url地址获取内容

    访问网络需要加Internet权限:android.permission.INTERNET 使用UrlConnection请求一个url地址获取内容:             //1.创建一个Url对 ...

  7. MySQL--事件/定时器

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11777311.html MySQL--事件/定时器 : 多个SQL的集合, 定时执行任务. 查 ...

  8. docker中run和start的区别?

    docker run 后面指定的是一个镜像 而docker start指定的是一个容器 docker run是利用镜像生成容器,并启动容器,而docker start是启动一个之前生成过的容器

  9. linux中安装swoole框架

    简单说说如何在linux中安装swoole框架. 具体的安装步骤其实和安装php源码类似. 下载源码 => 执行configure => make => make install 安 ...

  10. Keras学习:第一个例子-训练MNIST数据集

    import numpy as npimport gzip import struct import keras as ks import logging from keras.layers impo ...