Java常用--反射
反射的意义
你可能说,平时都是业务的增删查改基本用不到反射。但是如果你学会用反射了,可以减少重复代码,非常的好用。
反射是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常用--反射的更多相关文章
- Java常用类及反射,类加载
1.系统相关类 Java提供了System类和Runtime类来与程序运行的平台进行交互 A.System类代表当前Java程序的运行平台 a. System类是一个final类,该类的所有属性和方法 ...
- java常用英文解释
java常用名词解释: OO: object-oriented ,面向对象 OOP:object-oriented programming,面向对象编程 Author:JCC Object:对象JDK ...
- Java基础 —— Java常用类
Java常用类: java.lang包: java.lang.Object类: hashcode()方法:返回一段整型的哈希码,代表地址. toString()方法:返回父类名+"@&quo ...
- JAVA常用知识点及面试题总结
1. String.StringBuffer.StringBuilder三者区别? (1)三者在执行速率上的比较: String<StringBuffer<StringBuilder 原因 ...
- Java常用排序算法及性能测试集合
测试报告: Array length: 20000 bubbleSort : 573 ms bubbleSortAdvanced : 596 ms bubbleSortAdvanced2 : 583 ...
- 【转】java原理—反射机制
一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言 ...
- 014 Java的反射机制
作者:nnngu GitHub:https://github.com/nnngu 博客园:http://www.cnblogs.com/nnngu 简书:https://www.jianshu.com ...
- java原理—反射机制
http://www.cnblogs.com/forlina/archive/2011/06/21/2085849.html 一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程 ...
- 利用Java的反射与代理机制实现AOP
在上一篇文章中,我们讲述了利用Java的反射机制中实现Spring中的IOC,在本文中,我们将更进一步,讲述用Java的反射和动态代理机制来实现Spring的AOP. 一.AOP概述 AOP(Aspe ...
随机推荐
- java-异常-finally代码块
1 package p1.exception; 2 3 4 class Demo_0{ 5 public int show(int index) throws ArrayIndexOutOfBound ...
- python3 连接mysql数据库
准备工作: 1.在本地虚拟机172.16.0.115上安装mysql,并设置权限如下 mysql> grant all privileges on *.* to root@"%&quo ...
- Kubernetes 微服务最佳实践
本文由个人笔记 ryan4yin/knowledge 整理而来 本文主要介绍我个人在使用 Kubernetes 的过程中,总结出的一套「Kubernetes 配置」,是我个人的「最佳实践」. 其中大部 ...
- React之react-router(connected-react-router/react-router-dom)
文档: react-router-dom官方文档:https://reacttraining.com/react-router/web/guides/quick-start connected-rea ...
- plsql 带参数的游标
-- 带参数的游标 -- cursor c(no emp.deptno%type) is select * from emp where deptno=no; 参数的起名 不要和表中的列名相同! -- ...
- 最长公共子序列-LIS
题目描述 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个长为\(n\)的序列,求它的最长上升子序列的长度. 输入格式 输入第一行包含一个整数\(n\). 第二行包含\(n\)个整数\ ...
- JS let, var, const的用法以及区别
本文摘自多位前辈的博文,另外还有一些我的多余补充,摘自地址已补充.非常感谢各位前辈.仅以笔记学习为目的! 深入学习ES6的知识还请访问阮一峰老师的ES6教程 如果不使用let或者const,在JS只有 ...
- 为什么要配置path环境变量
因为在jdk下bin文件夹中有很多我们在开发中要使用的工具,如java.exe,javac.exe,jar.ex等,那么我们在使用时,想要在电脑的任意位置下使用这些java开发工具,那么我们就需有把这 ...
- Kubectl —— 基本命令
Kubectl -- 基本命令 1.kubectl 基本命令 2.项目的生命周期 3.声明式管理方法 service的类型: ClusterIP:提供一个集群内部的虚拟IP以供Pod访问( servi ...
- Linux基础:VLAN篇
一.二层基础知识 1.1 vlan介绍 本小节重点: vlan的含义 vlan的类型 交换机端口类型 vlan的不足 1.1.1 vlan的含义 局域网LAN的发展是VLAN产生的基础,因而先介绍一下 ...