反射的意义

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

反射是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. golang中的反射解析结构体标签tag

    package main import ( "fmt" "reflect" ) type resume struct { // 反射解析结构体标签tag Nam ...

  2. mac 更新到big sur 后,parallels虚拟机的一些问题:由于您尚未获得访问其中一些文件的授权,所以您不能恢复“Windows 10

    由于您尚未获得访问其中一些文件的授权,所以您不能恢复"Windows 10 Mac上使用PD虚拟机,打开系统时提示"由于您尚未获得访问其中一些文件的授权,所以您不能恢复" ...

  3. Python如何把八进制转换成ASCII码

    做题途中拿到一串八进制字符串 0126 062 0126 0163 0142 0103 0102 0153 0142 062 065 0154 0111 0121 0157 0113 0111 010 ...

  4. IO多路复用原理&场景

    目录 IO多路复用的历史 阻塞 IO 非阻塞 IO IO 多路复用 select poll epoll IO多路复用高效的原因 IO多路复用解决的什么问题 epoll比selector性能一定更好吗 ...

  5. 原生js获取子元素

    感谢原文作者:归一山人 原文链接:https://www.cnblogs.com/guiyishanren/p/12214757.html 获取子元素的方法有 //获取第一个demo类 dom = d ...

  6. Java-打印杨辉三角

    记录下哈 import java.util.Scanner; public class YangHuiTriangle { public static void main(String[] args) ...

  7. RPC原理及RPC实例分析(转)

    出处:https://my.oschina.net/hosee/blog/711632 在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服 ...

  8. js修改css

    转载请注明来源:https://www.cnblogs.com/hookjc/ <style type="text/css"> .style{font-size:9pt ...

  9. iOS程序的启动过程

    UIApplicationMain main函数中执行了一个UIApplicationMain这个函数 int UIApplicationMain(int argc, char *argv[], NS ...

  10. Redis分布式锁实现原理

    关于Redis分布式锁网上有很多优秀的博文,这篇文章仅作为我这段时间遇到的新问题的记录. 1.什么是分布式锁: 在单机部署的情况下,为了保证数据的一致性,不出现脏数据等,就需要使用synchroniz ...